多重继承的陷阱:钻石继承问题

 

python 中会出现钻石继承问题,如下所示

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…

钻石继承带来的问题:基类可能被多次调用,不符合设计的初衷。

解决方法:python 中提供了一个方法解析顺序(MRO),在同一个类避免被调用多次的前提下,使用广度优先和从左到右的原则去寻找需要的属性和方法。可以使用类名.__mro__ 来获取MRO顺序

 

class A():
def __init__(self):
print("进入A…")
print("离开A…")

class B(A):
def __init__(self):
print("进入B…")
super().__init__()
print("离开B…")

class C(A):
def __init__(self):
print("进入C…")
super().__init__()
print("离开C…")

class D(B, C):
def __init__(self):
print("进入D…")
super().__init__()
print("离开D…")

>>> d = D()
进入D…
进入B…
进入C…
进入A…
离开A…
离开C…
离开B…
离开D…

 

posted @ 2016-10-21 11:07  会开车的好厨师  阅读(337)  评论(0)    收藏  举报