Python 的MRO演算法
阿新 • • 發佈:2018-12-18
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__來檢視
class D(object): def show(self): print("D.show()") class E(object): def show(self): print("E.show()") class F(object): def show(self): print("F.show()") class B(D, E): pass class C(D, F): pass class A(B, C): pass print(A.__mro__) a = A() a.show()
拓撲排序:
找到一個入度為0的頂點(如圖A),如果未出現在其他列表的尾部,則將其輸出,並將其從所有列表中刪除,然後重複前面的操作;否則,取出下一個列表的頭部,重複上述操作
知道列表不為空或者不能找出可以輸出的元素。
如果是上圖情況,C --> A --> B --> X是第一個表的表頭,卻出現在第二個表的尾部 Y是第二個表的表頭,卻出現在第一個表的尾部,故無法構建一個沒有二義性的繼承關係