支持多继承的面向对象编程都可能会导致钻石继承(菱形继承)问题,看以下代码:
class A():
def __init__(self):
print("进入A…")
print("离开A…")
class B(A):
def __init__(self):
print("进入B…")
A.__init__(self)
print("离开B…")
class C(A):
def __init__(self):
print("进入C…")
A.__init__(self)
print("离开C…")
class D(B, C):
def __init__(self):
print("进入D…")
B.__init__(self)
C.__init__(self)
print("离开D…")
>>>d = D()
进入D…
进入B…
进入A…
离开A…
离开B…
进入C…
进入A…
离开A…
离开C…
离开D…
复制代码
为什么叫钻石继承(菱形继承),看下图就明白名字的由来了:
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半。你这里面super(SongBird,self).__init__()就相当于 Bird.__init__(self)python3在钻石继承才执行广度优先的.
class AA():a = 'a in AA'
class BB(AA):
pass
class CC(AA):
a = 'a in CC'
b = 'b in CC'
class DD(BB,CC):
pass
print(DD.a, DD.b) #广度优先
class AA():
a = 'a in AA'
class BB(AA):
pass
class CC():
a = 'a in CC'
b = 'b in CC'
class DD(BB,CC):
pass
print(DD.a, DD.b) #深度优先