Python: 多繼承模式下 MRO(Method Resolution Order) 的計算方式

發表於2016-12-05

大家可能已經知道了,在 Python 3(Python 2 的新式類)中多繼承模式是使用 C3 演算法來確定 MRO(Method Resolution Order) 的。

那麼具體是怎麼計算的呢?本文將基於 https://www.python.org/downlo… 中的幾個例子來講解 MRO 是怎麼計算的。

我們首先來定義一些符號: :

其中: :

加法運算: :

L[C] 表示類 C 的線性值,其實就是 C 的 MRO, 其中 :

比如有個類 : :

那麼: :

merge 的計算規則如下:

take the head of the first list, i.e L[B1][0]; if this head is not in the tail of any of the other lists, then add it to the linearization of C and remove it from the lists in the merge, otherwise look at the head of the next list and take it, if it is a good head. Then repeat the operation until all the class are removed or it is impossible to find good heads. In this case, it is impossible to construct the merge, Python 2.3 will refuse to create the class C and will raise an exception.

計算 MRO

先從簡單的類說起: :

簡單的子類: :

下面來看一個複雜的例子: :

很容易就可以想到: :

下面來計算 C, B, A:

L[C]: :

L[B]: :

L[A]: :

到這裡應該已經有一點眉目了。下面再來個上面那些類的變種,可以先自己算算看,後面有詳細的計算過程。

跟之前唯一的區別是 B(D, E) 變成了 B(E, D) :

通過這幾個例子應該對如何計算 MRO 已經有所瞭解了,更詳細的資訊可以閱讀 python MRO 文件 以及 wikipedia 中的 C3 演算法.

參考資料

相關文章