標籤:img port inf eth 一個 main pytho 問題 object
MRO即Method Resolution Order 方法解析順序,它的提出主要是為瞭解決Python中多繼承時,當父類存在同名函數時,二義性的問題
下面先看一個例子:
import inspectclass D: passclass C(D): passclass B(D): passclass A(B, C): passif __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演算法