假设我有一些调用 的类,__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 中工作。