python多繼承的搜尋順序變遷

2021-09-23 08:11:07 字數 926 閱讀 4993

python中使用多繼承,會涉及到查詢順序(mro)、重複呼叫(鑽石繼承,也叫菱形繼承問題)等

mromro即method resolution order,用於判斷子類呼叫的屬性來自於哪個父類。在python2.3之前,mro是基於深度優先演算法的,自2.3開始使用c3演算法,定義類時需要繼承object,這樣的類稱為新式類,否則為舊式類

從圖中可以看出,舊式類查詢屬性時是深度優先搜尋,新式類則是廣度優先搜尋

c3演算法最早被提出是用於lisp的,應用在python中是為了解決原來基於深度優先搜尋演算法不滿足本地優先順序,和單調性的問題。

示例看下面的例子

class x(object):

def f(self):

print 'x'

class a(x):

def f(self):

print 'a'

def extral(self):

print 'extral a'

class b(x):

def f(self):

print 'b'

def extral(self):

print 'extral b'

class c(a, b, x):

def f(self):

super(c, self).f()

print 'c'

print c.mro()

c = c()

c.f()

c.extral()

根據廣度搜尋原則最先搜尋到a,所以結果很明顯,如下所示

類c沒有extral函式,呼叫的是子類的該函式。這種類的部分行為由父類來提供的行為,叫做抽象超類.

Python 多繼承中MRO順序

在python3 裡面,使用super當有多繼承的情況出現的時候,有時候會出現呼叫父類init呼叫不到,因為在python3 裡面有乙個預設來處理類之間呼叫順序的c3 演算法,c3用來保證每個類只呼叫一次的演算法,所有通過super 來進行呼叫的時候都會根據裡面的順序來進行呼叫 在類中可以通過 cl...

Python多繼承方式及順序

python2中經典類使用的是深度優先,新式類使用的是廣度優先 python3經典類與新式類都是廣度優先。一圖以蔽之 如圖,b 繼承 a,c 繼承 a,d 繼承 b 和 c。上 coding utf 8 class p1 pass def foo self print p1 foo class p2...

Python 多繼承方式及順序

在看本篇之前,需要先了解兩個概念 深度優先 廣度優先。深度優先和廣度優先是兩種不同的演算法策略,兩者有什麼區別呢?我直接上 釋吧。如圖,b 繼承 a,c 繼承 a,d 繼承 b 和 c。tips py2 經典類是按深度優先來繼承的,新式類是按廣度優先來繼承的。py3 經典類和新式類都是統一按廣度優先...