创建一段代码,定义了四个类 A, B, C, D 。
B, C 类 继承了 A。
D 类继承 B, C 类
并且实例化一个 D 类
class A(object):
def __init__(self):
print("A")
class B(A):
def __init__(self):
super().__init__()
print("B")
class C(A):
def __init__(self):
super().__init__()
print("C")
class D(B, C):
def __init__(self):
super().__init__()
print("D")
print(D.__mro__)
d = D()
那么其中的 super 方法怎样执行呢?
结果如下:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
A
C
B
D
执行之前,有个 D.__mro__ 方法需要注意,它返回一个元组,其中包含了它的 super 执行顺序。
首先,D 会拿着自己去元组中匹配,匹配到自己之后执行其下一个父类的B的 __init__ 方法,之后再拿着B去元组中匹配, 执行 C 的 __init__ 方法, 最后 C 再去元组中匹配 执行 A 的 __init__ 方法。就出现了 A C B D 的结果。
原理:Python 使用 3C 算法,确保每个 __init__ 方法只被执行一次,解决了重复调用占用资源的问题。