为什么恰好是
A.__init__()
B.__init__()
D.__init__()
通过以下代码打印?特别是:
为什么C.__init__()
不打印?
为什么要C.__init__()
打印super().__init__()
而不是打印A.__init__(self)
?
#!/usr/bin/env python3
class A(object):
def __init__(self):
super(A, self).__init__()
print("A.__init__()")
class B(A):
def __init__(self):
A.__init__(self)
print("B.__init__()")
class C(A):
def __init__(self):
A.__init__(self)
print("C.__init__()")
class D(B, C):
def __init__(self):
super(D, self).__init__()
print("D.__init__()")
D()
B.__init__
是什么应该打电话给C.__init__
通过super(B, self).__init__()
,你绕过这一呼吁。为什么不打印C .__ init __()?
因为你没有告诉。多重继承涉及合作,您已经使用了显式的类引用,但拒绝了这种合作。
如果您将所有“超级类似”调用替换为super().__init__()
(因为您已将其标记为Python 3),您将看到类似以下的输出:
A.__init__()
C.__init__()
B.__init__()
D.__init__()
实际上,如果将B
“超级类”调用更改为以下任何一个,您将看到此输出:
super(B, self).__init__()
super().__init__()
那么,为什么在您的情况下A不给C打电话呢?
复制网站上有关MRO的概述良好的答案将是多余的。
如果我放上super().__ init __()而不是A .__ init __(self),为什么会打印C .__ init __()?
因为无参数的super()从左到右,所以B
先看一下,然后在B内使用显式类引用(A.__init__(self)
)。这样一来,您将失去D 也是超类的所有(大多数*)上下文C
。
super()
是什么可以帮助您导航MRO,并且C.__init__()
让您放心使用它。但在B
您中,您只是调用的类方法A
。
*正如您所提到的C.__init__()
,永远不会调用。但是,C
仍然显示在D.__bases__
:
(<class '__main__.B'>, <class '__main__.C'>)
在D.__mro__
:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
和isinstance(D(), C) is True
。
简而言之,Python 知道这C
是的超类D
,但是您为实现提供了C.__init__
和最终运行B.__init__
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句