Python - 方法解析顺序的特殊性

时间:2017-11-23 10:35:52

标签: python multiple-inheritance init super method-resolution-order

让我们拥有以下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()根本没有变化!

这种行为的原因是什么?

2 个答案:

答案 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())在此详细描述:

https://fuhm.net/super-harmful/