我正在覆盖类的__new__()
方法,以返回一个具有特定__init__()
的类实例。但是Python似乎调用了提供的类的__init__()
方法而不是特定实例的方法,尽管Python文档中说:
http://docs.python.org/reference/datamodel.html
典型的实现通过使用super(currentclass,cls).__new__(cls [,...])调用超类的 __new__() 方法并使用适当的参数创建类的新实例,然后根据需要修改新创建的实例后返回它。
如果__new__()返回cls的实例,则将像__init__(self [,...])一样调用新实例的__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()
运行起来的方式是在 myclass.__init__()
中显式地调用 self.__init__()
。