Python 关于super在多继承中的解析

时间:2022-11-29 13:57:20

一、单继承情况:

Python 关于super在多继承中的解析

解析:

创建B类的实例化对象时,执行初始化函数:

打印输出Enter B,当遇到super()调用父类初始化函数(此时是调用B类的父类A的__init__函数),输出Enter A、Leave B,调用完成父类初始化函数后,继续执行下一句代码,输出Leave B

二、多继承情况:

class A:
def __init__(self):
#print(super())
print("Enter A")
print("Leave A") class B(A):
def __init__(self):
print("Enter B")
#print(super())
super().__init__()
print("Leave B") # single = B()
# print(B.mro())
class C(A):
def __init__(self):
print("Enter C")
print(super())
super().__init__()
print("Leave C") class D(B,C):
def __init__(self):
print("Enter D")
print(super())
super().__init__()
print("Leave D") D()
print(D.mro()) 输出结果:

Enter D
<super: <class 'D'>, <D object>>
Enter B
Enter C
Enter A
Leave A
Leave C
Leave B
Leave D
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

解析:

1、执行顺序:D->B->C->A->object

2、根据执行顺序,执行D类,输出Enter D,

第一次执行super()时,调用D的父类B的__init__(),输出Enter B,

第二次执行super()时,则调用D的父类C的__init__(),输出Enter C,

第三次执行super()时,则调用A类的__init__(),输出Enter A和Leave A

C类执行完super().__init__()后,继续执行下一句,输出Leave C

B类执行完super().__init__()后,继续执行下一句,输出Leave B

D类执行完super().__init__()后,继续执行下一句,输出Leave D

总结:

super()当出现多继承时,调用的顺序是根据类实例化时的执行顺序决定。

另,python3的继承寻址方式是广度优先,先从左到右,最后到基类