簡體   English   中英

Python:類繼承

[英]Python: Class inherit

兩種情況有何不同?

# Error: Cannot create a consistent method resolution order (MRO) for bases A, B
class A:
    pass

class B(A):
    pass

class C(A, B):
    pass

# Current situation
class A:
    pass

class B(A):
    pass

class C(B, A):
    pass

您的C繼承自BA 因為B已經從A繼承了,所以Python現在無法確定首先查找哪個類的方法。 AB ,它將覆蓋A定義A

您無需在此處命名B所有基類; 只是從該類繼承:

class C(B):
    pass

B已經包含A ,您無需再次包含它。

更新區域:

注意:

為您詳細說明:

在查找實例屬性/方法時,Python需要確定以哪種順序搜索(直接和間接)基類。 它通過使用C3或MRO算法將繼承圖線性化(即通過將基類的圖轉換為序列)來實現此目的。 MRO算法是一種獨特的算法,可以實現幾個理想的屬性:

  1. 每個祖先類只出現一次
  2. 一個類總是出現在其祖先之前(“單調性”)
  3. 同一類的直接父級應該以與類定義中列出的順序相同的順序出現(“一致的本地優先順序”)
  4. 如果A類的子代總是出現在B類的子代之前,則A應該出現在B子之前(“一致的擴展優先順序”)

對於您的代碼,第二個約束要求B首先出現; 第三個約束條件要求A首先出現。 由於無法滿足所有約束,因此python報告您的繼承層次結構是非法的。

這不僅是技術細節。 在某些(希望很少)的情況下,如果方法是在多個類中定義的,則可能需要考慮應使用哪個類來獲取所調用的方法。 定義基類的順序會影響此選擇。

希望這可以幫助您理解並幫助您! :) 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM