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