【发布时间】:2016-09-10 06:06:41
【问题描述】:
我有以下代码:
class A:
def __init__(self):
print("A.__init__")
class B(A):
def __init__(self):
print("B.__init__")
super().__init__()
class C(A):
def __init__(self):
print("C.__init__")
super().__init__()
class D(B,C):
def __init__(self):
print("D.__init__")
super().__init__()
当我从 D 类中实例化一个对象时,
d = D()
我明白了:
>>> d = D()
D.__init__
B.__init__
C.__init__
A.__init__
为什么 A 类的 __init__() 只被调用一次,而且在最后?注意 B 类和 C 类都称为 A 类的 __init__(),所以我希望 A 类的 __init__() 应该被调用两次。
我阅读了 Python 3 的文档和 Hettinger 先生的博客,但没有弄清楚底层机制。那么super()是如何确定它只需要执行一次的呢?谢谢。
【问题讨论】:
-
能否请反对者解释一下为什么您反对我的问题?我真的不明白。谢谢
-
每个方法都调用
super().__init__(),不A.__init__()。为什么你认为A.__init__在这些情况下是同一个东西? -
super()查看 MRO 类(方法解析顺序)。对于多重继承(菱形继承图),MRO 仍将是线性,正是为了避免多次调用A.__init__()。查看D.__mro__以查看在运行时确定的实际MRO,您会看到它是[D, B, C, A]。阅读Python MRO documentation 了解原因和方法。
标签: python-3.x multiple-inheritance super