【发布时间】:2016-06-08 04:55:15
【问题描述】:
我已阅读 Expert Python Programming,其中包含一个多继承示例。书的作者有解释,但我没看懂,所以想换个说法。
示例显示对象B 被创建了两次!
能否给我一个直观的解释。
In [1]: class A(object):
...: def __init__(self):
...: print "A"
...: super(A, self).__init__()
In [2]: class B(object):
...: def __init__(self):
...: print "B"
...: super(B, self).__init__()
In [3]: class C(A,B):
...: def __init__(self):
...: print "C"
...: A.__init__(self)
...: B.__init__(self)
In [4]: print "MRO:", [x.__name__ for x in C.__mro__]
MRO: ['C', 'A', 'B', 'object']
In [5]: C()
C
A
B
B
Out[5]: <__main__.C at 0x3efceb8>
本书作者说:
这是由于
A.__init__(self)调用而发生的,该调用是使用 C实例,从而使super(A, self).__init__()调用B的构造函数
我不明白的一点是A.__init__(self) 调用将如何使super(A, self).__init__() 调用B 的构造函数
【问题讨论】:
-
你为什么不在 C 的 init 方法中使用
super? -
如果您认为
super调用的意思是“调用 MRO 中的下一个方法”,而不是“调用我的父类的方法”,那么这种行为应该更有意义。在这种情况下,您看到 B 打印两次的原因是因为 super 已经安排 B 的 init 被调用(由 A 的 init),因此当您从 C 显式调用 B.init 时,您会得到第二次调用。 -
查看 Raymond Hettinger 关于 super 的演讲,可能会更有意义:youtube.com/watch?v=EiOglTERPEo
-
关于您的问题标题,该对象不是“创建两次”。
__init__函数被调用了两次,但在此之前已经创建了对象。 -
澄清@interjay 的评论,__init__() 方法是一个initializer,而不是一个constructor。 C 实例由 __new__() 创建,然后传递给 C.__init__()。 C 的 __init__() 中的错误代码导致对 B 的 __init__() 的两次单独调用,用于已创建的唯一对象。
标签: python oop inheritance