我在覆盖__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