本來以為多重繼承很簡單,但是多看了一些資料後發現還是挺複雜的。
如果繼承情況簡單就還比較好理解,但是如果繼承的情況太過於複雜的話,python3
中會使用拓撲排序的方式來尋找繼承的父類。
有關繼承的拓撲排序
關於這方面看上面的文章就可以了。
我下面給出除此之外的一些說明
class
a(object):
deff
(self):
print('a')
class
b(object):
deff
(self):
print('b')
class
c(a,b):
pass
s = c()
s.f()
#a
由上面**的輸出可以看出,當前子類繼承多個父類的時候,對函式的繼承會優先選擇靠左邊的。
class
a(object):
deff
(self):
print('a')
class
b(object):
deff
(self):
print('b')
class
c(a,b):
pass
class
d(a,b):
deff
(self):
print("d")
class
e(c,d):
pass
s = e()
s.f()
#d
上面這段**會輸出d,這個說明對於e來說它會先去看c,發現c沒有就去繼承d的。而並非是發現c沒有,從c繼承下來的最左邊a中找。
class
a(object):
deff
(self):
print('a')
class
b(object):
deff
(self):
print('b')
class
c(a,b):
pass
class
d(a,b):
pass
class
e(c,d):
pass
s = e()
s.f()
#a
上面這段沒啥好說的。我們下面看一段會報錯的繼承:
class
a(object):
deff
(self):
print('a')
class
b(object):
deff
(self):
print('b')
class
c(b,a):
pass
class
d(a,b):
pass
class
e(c,d):
pass
s = e()
s.f()
#typeerror: cannot create a consistent method resolution
#order (mro) for bases a, b
上面這種寫法會報錯。看了一些資料後發下了這段話:class e(c,d)這個類如果去掉的話也可以沒有錯誤,如果加上這個類後,按照這種寫法,會導致mro中無法在唯一確認類之間的關係,會導致繼承關係混亂。(按照我的理解,雖然是按照拓撲排序查詢父類,但是對於同一層的父類,他們之間的順序定義是按下一層的繼承寫法來定義的(從左到右)。上面這段**,會使得在a,b這一層無法準確確定a與b的前後關係,所以報錯。) Python3多重繼承排序原理(C3演算法)
參考 類c的線性化記憶為l c c1,c2,cn 其中c1稱為l c 的頭,其餘元素 c2,cn 稱為尾。如果乙個類c繼承自基類b1,b2,b那麼l c 的計算過程為 類object為最高父類,所有類都繼承object l objicet object l c b1,b2,bn c merge l ...
python中多重繼承
除了從乙個父類繼承外,python允許從多個父類繼承,稱為多重繼承。多重繼承的繼承鏈就不是一棵樹了,它像這樣 class a object def init self,a print init a.self.a a class b a def init self,a super b,self ini...
多重繼承 C 中的多重繼承
多重繼承是c 的一項功能,其中乙個類可以從多個類繼承。繼承類的建構函式以它們繼承的相同順序被呼叫。例如,在以下程式中,在a的建構函式之前呼叫b的建構函式。include using namespace std class a class b class c public b,public a not...