谈谈Python中的super

先来看一段Python代码:

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
class Base(object):

def __init__(self):
print("enter Base")
print("leave Base")


class A(Base):

def __init__(self):
print("enter A")
super(A, self).__init__()
print("leave A")


class B(Base):

def __init__(self):
print("enter B")
super(B, self).__init__()
print("leave B")


class C(A, B):

def __init__(self):
print("enter C")
super(C, self).__init__()
print("leave C")


if __name__ == "__main__":
c = C()

运行这段代码的结果是:

1
2
3
4
5
6
7
8
enter C
enter A
enter B
enter Base
leave Base
leave B
leave A
leave C

继承关系为:

1
2
3
4
5
6
7
  Base
/ \
/ \
A B
\ /
\ /
C

__init__的调用顺序是C->A->B->Base。

我们可以用C.mro()看一下类的继承顺序:

1
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]

所以这里super(ClassName, self).__init__()并不是仅仅表示对父类的调用,而是调用在继承链上位于ClassName后一个的类的__init__方法。
因此super(C, self).__init__()调用的是位于继承链上C的下一个类,也就是A,其他的调用类似。