当一个类继承多个类 的时候,并且都有同名函数时,继承的顺序,以广度优先为主。
首先我们先定义五个类,这五个类都有相同的函数func,以便观看执行顺序:
class A():
def func(self):
print('A')
class B():
def func(self):
print('B')
class C():
def func(self):
print('C')
class D():
def func(self):
print('D')
class E():
def func(self):
print('E')
案例一:
E类继承ABCD四个类,并且注释掉E类的func方法,观看哪个父类的func被执行:
理论上:当E中方法被注释掉后,应该执行A中的func;同理,当A中方法被注释掉后,应该执行B中的func方法 ……………………等等。
class A():
def func(self):
print('A')
class B():
def func(self):
print('B')
class C():
def func(self):
print('C')
class D():
def func(self):
print('D')
class E(A,B,C,D):
def func(self):
print('E')
e=E()
e.func()
注释E类中func前:
注释E类中func后:
在自身函数被注释后,执行了父类A中的函数
同理:我们再注释掉A类中的func的函数
案例二: 钻石继承
这里我们操作D类,让D类继承B、C两个类,并且B、C两个类都继承A类:
理论:当D类的func被注释掉后,执行B中的;再把B中的func注释掉,执行C的;再注释掉C的,执行A的。
我们可以通过mro方法来查看类的继承关系顺序:
图解:
实践操作:
首先注释掉D中的func,
再注释掉B中的func,
整体来看:
class A():
def func(self):
print('A')
class B(A):
def func(self):
print('B')
super().func()
class C(A):
def func(self):
print('C')
super().func()
class D(B,C):
def func(self):
print('D')
super().func()
d=D()
d.func()
print(D.mro())
结果:
案例三:
D继承B,C两个类,B又继承A,C又继承E
class A():
def func(self):
print('A')
super().func()#在这里 A类看起来是没有继承类的,所以在Pycharm中这条语句会有个阴影提示没有func方法,但是在mro中可以看到他是继承C类的
# pass
class E():
def func(self):
print('E')
class B(A):
def func(self):
print('B')
super().func()
class C(E):
def func(self):
print('C')
super().func()
class D(B,C):
def func(self):
print('D')
super().func()
d=D()
d.func()
print(D.mro())
结果:
案例四: 小乌龟
它的继承关系是:D类继承B、C两个类,B又继承A,A又继承F,C继承E,E又继承F
理论:由广度优先可以得出,先是输出D,然后输出B,但是如果下一个为C时,这样就无法联系到A了,所以下一个为A (在此D——》B——》A) ,接下来可以广度优先了,到C,再到E最后到F 结果:(D——》B——》A——》C——》E——》F)
实现:
class F():
def func(self):
print("F")
class A(F):
def func(self):
print('A')
super().func()
class E(F):
def func(self):
print('E')
super().func()
class B(A):
def func(self):
print('B')
super().func()
class C(E):
def func(self):
print('C')
super().func()
class D(B,C):
def func(self):
print('D')
super().func()
d=D()
d.func()
print(D.mro())
结果: