继承在Python:什么问题,怎么解决

Python012

继承在Python:什么问题,怎么解决,第1张

多重继承的陷阱:钻石继承(菱形继承)问题

支持多继承的面向对象编程都可能会导致钻石继承(菱形继承)问题,看以下代码:

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) #深度优先