accès aux groupes de discussion, consultation et publication d'articles, recherche de "newsgroups"...
membres, identifiez-vous
é-mail Mot de passe
nouveau ? mot de passe oublié ?
Chargement... Chargement en cours...

Groupes français belges canadiens suisses internationaux Nétiquette
Échangez opinions et commentaires dans les forums de discussion.

Re: Un même identifiant pour des objets di fférents ?

 [  Nouvelle Discussion Nouvelle discussion  |  Répondre au groupe Répondre au groupe  |  fr.comp.lang.python ] 

Retour : Accueil du site fr comp lang python   charte stats de ce groupe


  Sujet:   Re: Un même identifiant pour des objets di fférents ?  
 De: bdesth.quelquech...@free.quelquepart.fr (Bruno Desthuilliers)
 Groupes: fr.comp.lang.python
 Organisation: Guest of ProXad - France
 Date: 19. Aug 2008, 21:25:18
 References: 1 2 3 4 5 6 7
Francois a écrit :
> Eric Brunel a écrit :
(snip)
>> Pour ce qui est effectivement construit par MaClasse.f, je laisse ça 
>> aux spécialiste(s) (au hasard, Bruno?).
> 
> C'est une question sur laquelle je me pencherai. Comme l'a dit Bruno, 
> les descripteurs sont la base de l'orienté objet en Python.

Disons que pour les classes "new-style", les méthodes sont implémentées 
à l'aide du type function et du protocole descripteur. Je ne sais pas si 
ça fait du protocole descripteur la "base de l'oo en python", mais ça a 
l'élégance de rendre le tout très générique et très customisable.

> Pour 
> l'instant, je comprends qu'avec obj = MaClasse(), obj.f construit un 
> truc qui fait que f est liée à obj et que donc lorsqu'on applique la 
> méthode f à obj (obj.f()), on a pas besoin de préciser la valeur du 
> paramètre self (obj en l'occurence) dans f.

Le "truc" en question s'appelle une instance de la classe method, et ce 
serait facile à implémenter en pur Python :

class Method(object):
     def __init__(self, func, instance, cls):
         self.im_func = func
         self.im_self = instance
         self.im_class = cls
     def __call__(self, *args, **kw):
         # Q&D unbound method
         if self.im_self is None:
             im_self = args.pop(0)
             if not isinstance(im_self, self.cls):
                 raise TypeError("unbound method yadda yadda")
         else:
             im_self = self.im_self
         return self.im_func(im_self, *args, **kw)

NB : le nommage n'est pas accidentel:
 >>> class Toto(object):
....    def tata(self): pass
....
 >>> t = Toto()
 >>> meth = t.tata
 >>> meth
<bound method Toto.tata of <__main__.Toto object at 0xb7c7fd2c>>
 >>> meth.im_self, meth.im_class, meth.im_func
(<__main__.Toto object at 0xb7c7fd2c>, <class '__main__.Toto'>, 
<function tata at 0xb7c7a9cc>)
 >>>


Et c'est ainsi q'une fonction devient une méthode, n°2 : la mission !-)


DateSujet  Auteur
01.01.
o 
Groups Explorer contact votre avis comment ça marche? rechercher un groupe suggérer un groupe abuse accueil du site   Imprimer cette page   Envoyer cette page à un(e) ami(e)
Free counter and web stats