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 !-)