Python多繼承之MRO算法
阿新 • • 發佈:2018-08-12
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算法