繼承順序
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...