Python - 方法解析顺序的特点

Python - Peculiarities in 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继承自两个前身class分支,它们没有共同的祖先(除了默认的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'>]

完全符合预期。

现在说我粗心忘了在A1B1中调用super().__init__()(我不太关心初始化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() 根本没有改变!

这种行为的原因是什么?

MRO 的打印输出向您展示了这是为什么。 Python 以该特定顺序调用父方法,因此得名。它调用 A2 的方法,该方法有一个超级调用,然后调用 A1 的方法;但是 A1 并没有依次调用 super 所以链停在那里。

好吧,回答我自己的问题:这里详细描述了让我困惑的事情(未能在直接继承形式 object 的 class 中调用 super()):

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