让我们拥有以下Python2代码:
#!/usr/bin/python
class A1(object):
def __init__(self):
super(A1, self).__init__()
print "A1.__init__"
class A2(A1):
def __init__(self):
super(A2, self).__init__()
print "A2.__init__"
class B1(object):
def __init__(self):
super(B1, self).__init__()
print "B1.__init__"
class B2(B1):
def __init__(self):
super(B2, self).__init__()
print "B2.__init__"
class C(A2, B2):
def __init__(self):
super(C, self).__init__()
print "C.__init__"
C()
print C.mro()
也就是说,C
继承自两个前驱类分支,它们没有共同的祖先(默认的object
除外,不确定它有多重要)。代码输出:
B1.__init__
B2.__init__
A1.__init__
A2.__init__
C.__init__
[<class '__main__.C'>, <class '__main__.A2'>, <class '__main__.A1'>, <class '__main__.B2'>, <class '__main__.B1'>, <type 'object'>]
完全符合预期。
现在说我不小心忘记在super().__init__()
和A1
打电话给B1
(我不在乎object
那么多...)。然后输出变为:
A1.__init__
A2.__init__
C.__init__
[<class '__main__.C'>, <class '__main__.A2'>, <class '__main__.A1'>, <class '__main__.B2'>, <class '__main__.B1'>, <type 'object'>]
现在只初始化了A1
- A2
分支 - 而C.mro()
根本没有变化!
这种行为的原因是什么?
答案 0 :(得分:2)
MRO的打印输出显示了这是为什么。 Python以特定顺序调用父方法,因此命名。它调用A2的方法,它有一个超级调用,然后调用A1的方法;但A1并没有反过来召唤超级,所以链条停在那里。
答案 1 :(得分:0)
好的,回答我自己的问题:这个让我感到困惑的事情(未能直接从<div class="container">
<h2 class="data-type data-type-a">A (should be black / is black)</h2>
<h2 class="data-type data-type-a">A (should be red / is red)</h2>
<h2 class="data-type data-type-b">B (should be green / is green)</h2>
<h2 class="data-type data-type-b">B (should be blue / is blue)</h2>
</div>
继承的类中调用super()
)在此详细描述: