Python 的MRO演算法

2021-09-02 13:54:46 字數 1423 閱讀 6119

mro method resolution order 方法解析順序

作用:在python中用於處理二義性問題的演算法

python支援多繼承,多繼承的語言往往會遇到兩類二義性的問題:

1、有兩個基類a、b,a和b都定義了方法f() ,c繼承a和b,呢麼呼叫c的f()方法是會出現不確定

2、有乙個基類a,定義了方法f(),b類和c類繼承了a類,d類繼承了b和c類,則此時d類不知道應該繼承b類的f()方法還是c類的f()方法

python至少有三種不同的mro:

1、經典類的深度遍歷(dfs)

2、python2.2的新式類預計算 廣度遍歷(bfs)

3、python2.3的新式類的c3演算法。也是python3唯一支援

python2.3以後採用了c3方法來確定方法解析順序(mro)

這種方法類似於圖的拓撲排序 可以用.__mro__來檢視

拓撲排序:

找到乙個入度為0的頂點(如圖a),如果未出現在其他列表的尾部,則將其輸出,並將其從所有列表中刪除,然後重複前面的操作;否則,取出下乙個列表的頭部,重複上述操作

知道列表不為空或者不能找出可以輸出的元素。

如果是上圖情況,c --> a --> b --> x是第乙個表的表頭,卻出現在第二個表的尾部 y是第二個表的表頭,卻出現在第乙個表的尾部,故無法構建乙個沒有二義性的繼承關係

Python新式類MRO演算法 C3演算法

mro method resolution order,即方法解析順序,是用來處理python中的二義性問題的演算法。二義性python因為支援多繼承,而多繼承的程式語言往往存在二義性問題。二義性問題 魔鬼三角繼承 有兩個基類a和b,a和b中都定義了方法f c類繼承了a類和b類,那麼呼叫c類的f 時...

python中mro中的C3演算法

mro即 method resolution order,主要用於在多繼承時判斷調的屬性的路徑 來自於哪個類 之前檢視了很多資料,說mro是基於深度優先搜尋演算法的。但不完全正確在python2.3之前是基於此演算法,但從python2.3起應用了新演算法 c3演算法。為什麼採用c3演算法 c3演算...

python的多繼承C3 mro 演算法

例一 按照深度a類從左往右有三條可繼承的 路 先按照深度優先的演算法,將每一路的每乙個節點加到列表中 b b,d,f,h c c,e,g,h d d,f,h a b,c,d a的廣度順序 得到四個列表,四個列表按照頭尾的方式進行比較,如何劃分頭尾呢.第乙個為頭,剩下的都是尾,比較第乙個列表的頭是都在...