假设我有一个调用 __new__
的类,如何与 mro 协作,并根据需要调用超类的 __new__
(带参数),但不使用额外的参数调用 object.__new__
?例如,仅当您不向构造函数传递任何参数时,它才起作用:
class A(object):
def __new__(cls, *args, **kwargs):
print("A.__new__ called")
return super(A, cls).__new__(cls, *args, **kwargs)
class B(object):
def __new__(cls, *args, **kwargs):
print("B.__new__ called")
return super(B, cls).__new__(cls, *args, **kwargs)
class C(A, B): pass
>>> C.mro()
[__main__.C, __main__.A, __main__.B, builtins.object]
>>> C()
A.__new__ called
B.__new__ called
但是如果调用时带有参数,它将失败(因为在某个时刻Python更改为只接受调用类作为参数给object.__new__
):
>>> C(1)
A.__new__ called
B.__new__ called
Traceback (most recent call last):
...
TypeError: object() takes no parameters
那么,A
或B
如何确定它们的超类是object
呢?我应该这样做吗:super(A, cls).__new__ is object.__new__
?检查mro()[1] == builtins.object
吗?还是我只需要决定"A将从不在__new__
中尝试友好地调用父类"(例如通过执行return object.__new__(cls)
)?编辑:如果类定义了自定义的
__init__
方法,在Python 2.6和Python 2.7中可以正常工作,但在Python 3中仍然会不起作用。
super
зҡ„дёҖдёӘз»Ҹе…ёй—®йўҳгҖӮиҝҷйҮҢжңүдёҖдәӣжңүи¶Јзҡ„йҳ…иҜ»жқҗж–ҷгҖӮ - shx2__new__
方法。如果C
、B
或A
都不需要参数,则object.__new__()
引发异常是完全正确的事实。 - Martijn Pieters__init__
,那么object.__new__
也不会引发异常。 - Martijn Pieters