Django-fr

Forum

#1 19-01-2011 15:45:25

beegees
Membre
Inscription : 26-12-2010
Messages : 66

Je ne comprends pas du tout ce code

Bonjour tout le monde,

J'analyse le code d'une application que je dois modifier.

Je suis de plus en plus à l'aise avec ce code, mais là, je coince.

class SubclassingQuerySet(QuerySet):

    def __getitem__(self, k):
        result = super(SubclassingQuerySet, self).__getitem__(k)
        if isinstance(result, models.Model) :
            return result.as_event_class()
        else :
            return result
    def __iter__(self):
        for item in super(SubclassingQuerySet, self).__iter__():
            yield item.as_event_class()

    def get(self, *args, **kwargs):
        result = super(SubclassingQuerySet, self).get(*args, **kwargs)
        if (result.__class__== Event):
            return result.as_event_class()
        else:
            return result

Je ne comprends pas plusieurs choses.

On hérite de QuerySet ?

Sauriez-vous m'expliquer à quoi set __getitem__, __iter__, super() ?

À quoi sert cette classe exactement ?

Merci d'avance pour l'aide.

Hors ligne

#2 19-01-2011 15:54:21

Bruno Bord
Membre
Inscription : 11-08-2010
Messages : 25

Re : Je ne comprends pas du tout ce code

> Je ne comprends pas plusieurs choses.
>
> On hérite de QuerySet ?

Oui.
Comme pour tes modèles, qui héritent de models.Model
Même syntaxe.

>
> Sauriez-vous m'expliquer à quoi set __getitem__, __iter__, super() ?

Django c'est du Python.
http://docs.python.org/library/operator.html#operator.getitem
http://docs.python.org/reference/datamodel.html#object.__iter__
http://docs.python.org/library/functions.html#super

>
> À quoi sert cette classe exactement ?
>

Quand tu te seras un peu mieux fait les dents sur la programmation
objet, je pense que tu comprendras à quoi elle sert...

(ça peut paraître abrupt, comme réponse, mais comprendre les
mécanismes de Python avant de se lancer dans Django, c'est un pas
vraiment important. Plus tu seras à l'aise dans le premier, plus tu
seras à l'aise dans le second).

Bon courage.

--
No'
http://jehaisleprintemps.net

Hors ligne

#3 19-01-2011 15:56:48

Mathieu AGOPIAN
Modérateur
Inscription : 11-08-2010
Messages : 35

Re : Je ne comprends pas du tout ce code

surtout bien lire la phrase de Bruno: "c'est UN pas vraiment important" (si
on oublie le "un", la phrase change de sens)

My 2 cents wink

Mathieu

Le 19 janvier 2011 15:54, Bruno Bord <mlbrunobord _AT_ gmail.com> a écrit :

> > Je ne comprends pas plusieurs choses.
> >
> > On hérite de QuerySet ?
>
> Oui.
> Comme pour tes modèles, qui héritent de models.Model
> Même syntaxe.
>
> >
> > Sauriez-vous m'expliquer à quoi set __getitem__, __iter__, super() ?
>
> Django c'est du Python.
> http://docs.python.org/library/operator.html#operator.getitem
> http://docs.python.org/reference/datamodel.html#object.__iter__
> http://docs.python.org/library/functions.html#super
>
> >
> > À quoi sert cette classe exactement ?
> >
>
> Quand tu te seras un peu mieux fait les dents sur la programmation
> objet, je pense que tu comprendras à quoi elle sert...
>
> (ça peut paraître abrupt, comme réponse, mais comprendre les
> mécanismes de Python avant de se lancer dans Django, c'est un pas
> vraiment important. Plus tu seras à l'aise dans le premier, plus tu
> seras à l'aise dans le second).
>
> Bon courage.
>
> --
> No'
> http://jehaisleprintemps.net
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#4 19-01-2011 18:49:31

afranck64
Membre
Inscription : 30-12-2010
Messages : 20

Re : Je ne comprends pas du tout ce code

Bonsoir,

-La méthode __iter__ permet d'effectuer des:

for element in mavaraible:

-La méthode __getitem__ permet d'effectuer des:

mavariable[index]

Donc elle attend au moins un paramètre (en plus du <self>).

Voici un TOUT petit exemple.

class Test:
    def __getitem__(self,index):
        return "Item geted!"

    def __iter__(self):
        return iter(range(10))

et on a:

>>> me = Test()
>>> me[1]
'Item geted!'
>>> me["hello world!"]
'Item geted!'
>>> for val in me:
    print val

    
0
1
2
3
4
5
6
7
8
9

@ plus wink

Hors ligne

#5 19-01-2011 18:58:39

quinode
Membre
Lieu : Auvergne
Inscription : 14-10-2010
Messages : 89
Site Web

Re : Je ne comprends pas du tout ce code

beegees a écrit :

On hérite de QuerySet ?
À quoi sert cette classe exactement ?

oui, qui est un objet specifique à Django en général utilisé pour renvoyer des données de l'ORM, après un QUERY donc
http://docs.djangoproject.com/en/dev/re … querysets/

le gars voulait donc modifier le comportement normal de cet objet, pour que ça soit plus pratique pour lui j'imagine

beegees a écrit :

Sauriez-vous m'expliquer à quoi set __getitem__, __iter__, super() ?

Afranck a expliqué ça très bien
dès que des méthodes commencent avec un double underscore __ c'est qu'elles sont utilisées en "interne" par l'objet, dans d'autres méthodes
pas interdites donc, mais pouvant evoluer dans le futur, donc pas dans la documentation.

Ce que je ne comprends pas c'est le "as_event_class()", inconnu chez Google qui ne renvoie qu'un snippet avec ce code justement...

Hors ligne

#6 19-01-2011 20:45:53

afranck64
Membre
Inscription : 30-12-2010
Messages : 20

Re : Je ne comprends pas du tout ce code

Re,

Il se trouve en fait que la méthode "as_event_class" n'est pas <django-made>. Elle est définie par le codeur. (Vérification effectuée en faisant la recherche dans la version 1.2.4).

Hors ligne

Pied de page des forums