一、单继承情况:
解析:
创建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的继承寻址方式是广度优先,先从左到右,最后到基类