1. 程式人生 > >Python 的MRO演算法

Python 的MRO演算法

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是第二個表的表頭,卻出現在第一個表的尾部,故無法構建一個沒有二義性的繼承關係
在這裡插入圖片描述