1. 程式人生 > >python稜形繼承(鑽石繼承)

python稜形繼承(鑽石繼承)

class A(object):
def func(self): print('A')

class B(A):
def func(self):
super().func()
print('B')

class C(A):
def func(self):
super().func()
print('C')

class D(B,C):
def func(self):
super().func()
print('D')

b = D()
b.func()
print(B.mro())
#2.7
# 新式類 繼承object類的才是新式類 廣度優先
# 經典類 如果你直接建立一個類在2.7中就是經典類 深度優先
# print(D.mro())
# D.mro()

# 單繼承 : 子類有的用子類 子類沒有用父類
# 多繼承中,我們子類的物件呼叫一個方法,預設是就近原則,找的順序是什麼?
# 經典類中 深度優先
# 新式類中 廣度優先
# python2.7 新式類和經典類共存,新式類要繼承object
# python3 只有新式類,預設繼承object
# 經典類和新式類還有一個區別 mro方法只在新式類中存在
# super 只在python3中存在
# super的本質 :不是單純找父類 而是根據呼叫者的節點位置的廣度優先順序來的

 

B和C有共同父類,class D(B,C):先找B再找C最後找A

super按照稜形繼承順序查詢,執行順序類似多裝飾器的套娃執行順序。

如果A和E沒有共同父類要保證所有類都能執行到,順序就變為BACE

A和E有共同父類也要執行B後再執行A,因為如果執行C就不會執行A了(A不是C的父類)。

 

總結:

python3廣度優先,但要保證所有的父類都搜尋到,所以有的時候也會深度優先,在考慮繼承順序時,只需要考慮到能將所有的類都連起來就對了。