我在覆蓋__new__()
方法返回一個具有特定__init__()
集合的類實例。蟒蛇似乎在爲什麼Python不調用實例方法__init __()創建實例,而是調用類提供的__init __()來代替?
http://docs.python.org/reference/datamodel.html
調用這個類提供的__init__()
方法,而不是特定實例的方法,雖然Python的文件說:
典型實現創建由類的新實例使用super(currentclass,cls).__ new __(cls [,...]) 調用 超類的__new __()方法,然後在返回它之前修改新創建的實例爲 。
如果__new __()返回CLS的實例,那麼新實例的__init __()方法 將被調用像__init __(自我[,...]),其中self是新實例,其餘的 論據和傳遞給__new __()一樣。
這裏是我的測試代碼:
#!/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()
其輸出
$ 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 = {}
,似乎只有這樣才能獲得myinit()
運行,是顯式調用它self.__init__()
內myclass.__init__()
。
大問題! – Marcin 2012-07-24 16:49:29