Jestem overover metody __new__()
klasy, aby zwrócić wystąpienie klasy, który ma określony zestaw __init__()
. Python wydaje się wywołać w swojej klasie pod warunkiem __init__()
metody zamiast metody specyficzne dla instancji, chociaż dokumentacji Pythona wDlaczego metoda wywołania instancji Pythona nie __init __() podczas tworzenia instancji, ale zamiast tego wywołuje metodę __init __() dostarczoną przez klasę?
http://docs.python.org/reference/datamodel.html
mówi:
Typowe implementacje utworzyć nową instancję klasy przez Wywołanie metody __new __() klasy superklasy przy użyciu super (currentclass, cls) .__ new __ (cls [, ...]) z odpowiednimi argumentami, a następnie zmodyfikowanie nowo utworzonej instancji jako niezbędnej przed jej zwróceniem.
Jeśli __new __() zwraca instancję CLS, a następnie nowej instancji za __init __() metoda zostanie wywołany jak __init __ (ja [...]), gdzie jaźń jest nowa instancja i pozostałe argumenty są taki sam jak przekazano do __new __().
Oto mój kodu testu:
#!/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()
który wyprowadza
$ 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 = {}
Wydaje się, że jedynym sposobem, aby dostać myinit()
do uruchomienia, jest to nazwać jednoznacznie jako self.__init__()
wewnątrz myclass.__init__()
.
Dobre pytanie! – Marcin