python3中多重繼承的問題

2021-08-15 13:05:25 字數 1890 閱讀 6927

本來以為多重繼承很簡單,但是多看了一些資料後發現還是挺複雜的。

如果繼承情況簡單就還比較好理解,但是如果繼承的情況太過於複雜的話,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...