python之路 鑽石繼承

2022-03-30 19:02:45 字數 1155 閱讀 9503

繼承順序

class

a(object):

deftest(self):

print('

from a')

class

b(a):

deftest(self):

print('

from b')

class

c(a):

deftest(self):

print('

from c')

class

d(b):

deftest(self):

print('

from d')

class

e(c):

deftest(self):

print('

from e')

class

f(d,e):

#def test(self):

#print('from f')

pass

f1=f()

f1.test()

print(f.__mro__) #

只有新式才有這個屬性可以檢視線性列表,經典類沒有這個屬性

#新式類繼承順序:f->d->b->e->c->a

#經典類繼承順序:f->d->b->a->e->c

#python3中統一都是新式類

#pyhon2中才分新式類與經典類

繼承順序

順序繼承原理

python到底是如何實現繼承的,對於你定義的每乙個類,python會計算出乙個方法解析順序(mro)列表,這個mro列表就是乙個簡單的所有基類的線性順序列表,例如

>>> f.mro() #等同於f.__mro__

[, , , , , , ]

為了實現繼承,python會在mro列表上從左到右開始查詢基類,直到找到第乙個匹配這個屬性的類為止。

而這個mro列表的構造是通過乙個c3線性化演算法來實現的。我們不去深究這個演算法的數學原理,它實際上就是合併所有父類的mro列表並遵循如下三條準則:

1.子類會先於父類被檢查

2.多個父類會根據它們在列表中的順序被檢查

3.如果對下乙個類存在兩個合法的選擇,選擇第乙個父類

鑽石繼承與虛繼承

首先,何為鑽石繼承,顧名思義,在類的繼承過程中,繼承結構是乙個類似菱形 鑽石 的結構就屬於鑽石繼承,如下 這是乙個最簡單的鑽石繼承。實際上,在複雜的繼承表中,只要子類按不同的繼承路徑回溯到基類有菱形結構,均屬鑽石繼承。下面先看乙個例子,鑽石繼承在c 程式設計中帶來的問題。1 2 include3 u...

python中的多繼承,鑽石繼承,搜尋過程

python中的多繼承,鑽石繼承 查詢屬性的過程 簡單版本 詳細過程可以參考python參考手冊 舊式類中,從左到右,從b a 然後繼續從c a 新式類中,從左到右,先b 然後c c 後面沒有其他類了,繼續從b的父類開始,等b父類搜尋完,搜尋c的父類 其中的原因簡單解釋下 低層的類較高層的類相比,或...

python多繼承 鑽石繼承 的問題和解決

在菱形多繼承中,如果用父類.init 來呼叫父類的初始化方法,最上層會執行兩次,所以遇到這種情況,python中用super.init 來解決這個問題。class grand father object def init self print 爺爺 class father left grand f...