1. 程式人生 > >Python多繼承之MRO算法

Python多繼承之MRO算法

tro 拓撲排序 png mage __name__ 技術分享 ima bject import

MRO即Method Resolution Order 方法解析順序,它的提出主要是為了解決Python中多繼承時,當父類存在同名函數時,二義性的問題

下面先看一個例子:

import inspect


class D:
    pass


class C(D):
    pass


class B(D):
    pass


class A(B, C):
    pass


if __name__ == __main__:
    print(inspect.getmro(A))

B和C繼承D A繼承B和C 這是一個簡單的多繼承,下面看Python3中的輸出結果:

(<class __main__.A>, <class __main__.B>, <class __main__.C>, <class __main__.D>, <class object>)

執行結果是 A ->B ->C ->D

技術分享圖片

在Python3中,MRO算法采用的是有向無環圖的拓撲排序,這裏我們采用剪枝的方法來分析:

如上圖所示:首先找入度為0的點 A,因為沒有類繼承A,剪去A左右兩邊,得到 A ->:

技術分享圖片

接下來再找下一個入度為0的點(剪枝後沒有類繼承B和C了),B和C的入度為0,根據先取最左原則,剪去B的枝,得到 A ->B ->:

技術分享圖片

再找到入度為0的點為C,則剪去C的枝得到 A ->B ->C ->

最後得到: A ->B ->C ->D的順序

接下來看Python2.7下的執行結果:

(<class __main__.A at 0x7f81a17ca1f0>, <class __main__.B at 0x7f81a17ca188>, <class __main__.D at 0x7f81a17ca0b8>, <class __main__.C at 0x7f81a17ca120>)

可以看到執行結果是 A ->B ->D ->C

這裏和python3執行結果不同是因為 Python2.7的MRO算法采用的是深度優先搜索(子節點順序:從左到右),所以是 A ->B ->D ->C

Python多繼承之MRO算法