Python的super()有效吗?

Python's super() working?

我有一个这样的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class A():
    def go(self):
        print("A")


class B(A):
    def go(self):
        super().go()
        print("B")


class C(A):
    def go(self):
        super().go()
        print("C")


class D(A):
    def go(self):
        super().go()
        print("D")


class E(B, C, D):
    def go(self):
        super().go()
        print("E")


a  = A()
b = B()
c = C()
d = D()
e = E()

print(e.go())

以下是输出:

1
2
3
4
5
6
A
D
C
B
E
None

我很好奇super()的工作流程,它是如何在b之前打印d、c的,为什么最后没有打印出来?一个详细的解释将是非常感谢。


如果调用help(e),则可以看到方法解析顺序:

1
2
3
4
5
6
7
8
9
10
>>> e = E()
>>> help(e)
class E(B, C, D)
 |  Method resolution order:
 |      E
 |      B
 |      C
 |      D
 |      A
 |      builtins.object

由于您首先调用super,然后调用print,输出将完全是反转的mro

1
A -> D -> C -> B -> E

如果您在super呼叫之前拥有print,它将遵循MRO:

1
E -> B -> C -> D -> A

但是,E.go没有返回任何内容(return None是隐式的,如果之前没有其他return,那么它将在调用所有方法之后打印None