Ho superato il metodo __new__()
di una classe per restituire un'istanza di classe che ha uno specifico set __init__()
. Python sembra chiamare il __init__()
metodo della classe fornita invece del metodo specifico per esempio, anche se la documentazione Python aPerché Python non chiama il metodo istanza __init __() sulla creazione dell'istanza ma chiama __init __() fornita dalla classe?
http://docs.python.org/reference/datamodel.html
dice:
implementazioni tipiche creare una nuova istanza della classe invocando il metodo __new __() della superclasse usando super (currentclass, cls) .__ new __ (cls [, ...]) con gli argomenti appropriati e quindi modificando l'istanza appena creata come necessaria prima di restituirla.
Se __new __() restituisce un'istanza di cls, allora il nuovo dell'istanza __init __() Metodo verrà richiamato come __init __ (self [, ...]), dove l'auto è la nuova istanza e gli restanti argomenti sono lo stesso che è stato passato a __new __().
Ecco il mio codice di prova:
#!/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()
che emette
$ 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 = {}
Sembra che l'unico modo per ottenere myinit()
a correre, è quello di chiamare esplicitamente come self.__init__()
all'interno myclass.__init__()
.
grande domanda! – Marcin