iT邦幫忙

0

python 方法解析順序 (MRO, Method Resolution Order)

  • 分享至 

  • xImage
  •  

方法解析順序 (MRO, Method Resolution Order)

Python 的方法解析順序(MRO, Method Resolution Order) 是指在多重繼承中,Python 用來確定調用哪個父類的方法或屬性的規則和順序。這是 Python 處理多重繼承時的一個核心機制,確保方法調用不會混亂且遵循一致的邏輯。Python 使用 C3 線性化算法 來解析多重繼承中的方法調用順序。
你可以使用 ClassName.mro()help(ClassName) 查看 MRO。

如果不知道什麼是多重繼承
可先閱讀此篇Python 物件導向編程(Object-Oriented Programming, OOP): Class

MRO 的主要規則

  1. 線性化順序(C3 線性化算法):MRO 會按照子類到父類的順序線性化所有類,確保每個父類只出現一次,且順序遵循從左到右的深度優先搜索,但也會考慮父類的繼承順序。
  2. 避免重複:每個父類僅在 MRO 中出現一次,避免重複調用。
  3. 遵循類的繼承關係:如果類 B 和類 C 同時繼承了類 A,B 的方法會優先於 C 的方法(如果子類繼承順序是 class D(B, C))。
class A:
    def action(self):
        print("Action from A")

class B(A):
    def action(self):
        print("Action from B")

class C(A):
    def action(self):
        print("Action from C")

class D(B, C):
    pass

print(D.mro())

輸出:

[<class '__main__.D'>, 
 <class '__main__.B'>, 
 <class '__main__.C'>, 
 <class '__main__.A'>, <class 'object'>]

解決命名衝突的範例

可以使用 super() 調用特定父類別的方法:

class Parent1:
    def action(self):
        print("Parent1 action")

class Parent2:
    def action(self):
        print("Parent2 action")

class Child(Parent1, Parent2):
    def action(self):
        print("Child action")
        super(Parent1, self).action()  # 調用 Parent2 的方法

child = Child()
child.action()

輸出:

Child action
Parent2 action

使用多重繼承的建議

  • 保持類別設計簡單:避免過於複雜的多重繼承結構。
  • 使用 MRO 理解行為:在多重繼承中,學習 MRO 是理解方法調用順序的關鍵。
  • 考慮組合 (Composition):如果繼承太複雜,考慮使用組合來代替多重繼承

小結

多重繼承是一種強大的功能,可以組合不同的父類別特性。但由於可能帶來方法解析的複雜性和命名衝突,使用時需要謹慎設計類別結構。

Python 物件導向編程(Object-Oriented Programming, OOP


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言