J'applique la méthode __new__()
d'une classe pour renvoyer une instance de classe qui a un ensemble spécifique __init__()
. Python semble appeler la méthode de classe fourni __init__()
au lieu de la méthode spécifique à l'instance, bien que la documentation Python àPourquoi Python n'appelle-t-il pas la méthode d'instance __init __() lors de la création de l'instance mais appelle plutôt __init __() à la place?
http://docs.python.org/reference/datamodel.html
dit:
implémentations typiques créer une nouvelle instance de la classe par invoquant la méthode __new __() de la superclasse en utilisant super (currentclass, cls) .__ new __ (cls [, ...]) avec les arguments appropriés, puis en modifiant l'instance nouvellement créée comme avant de la renvoyer.
Si __new __() retourne une instance de cls, la nouvelle méthode __ __init de l'instance() sera invoqué comme __init __ (self [...]), où l'auto est la nouvelle instance et les arguments restants sont les mêmes que ceux qui ont été transmis à __new __().
Voici mon code de test:
#!/usr/bin/env python
import new
def myinit(self, *args, **kwargs):
print "myinit called, args = %s, kwargs = %s" % (args, kwargs)
class myclass(object):
def __new__(cls, *args, **kwargs):
ret = object.__new__(cls)
ret.__init__ = new.instancemethod(myinit, ret, cls)
return ret
def __init__(self, *args, **kwargs):
print "myclass.__init__ called, self.__init__ is %s" % self.__init__
self.__init__(*args, **kwargs)
a = myclass()
qui sort
$ python --version
Python 2.6.6
$ ./mytest.py
myclass.__init__ called, self.__init__ is <bound method myclass.myinit of <__main__.myclass object at 0x7fa72155c790>>
myinit called, args =(), kwargs = {}
Il semble que le seul moyen d'obtenir myinit()
pour exécuter, est d'appeler explicitement comme self.__init__()
l'intérieur myclass.__init__()
.
Grande question! – Marcin