這個問題在這里已經有了答案: 如何在python中使用子類的方法呼叫第二個父類的方法? (1 個回答) 7 天前關閉。
我有 A、B 和 C 類。C 繼承自 A 和 B,并且在大多數情況下,只要有方法相互覆寫,我希望 A 覆寫 B,所以我有以下結構:
class A:
def some_method(self):
return self.some_attribute
class B:
def some_method(self):
return self.some_other_attribute
class C(A,B):
def some_method(self):
var = super().some_method() -> this will give me the method from A, but I want the B one
return var 1
所以我的問題是如何使用 super() 或其他方式some_method()從 B 呼叫,所以我可以在 C 中的方法覆寫中使用它?
另外,我正在使用 Python 3.*
uj5u.com熱心網友回復:
Python 是一種具有多重繼承的語言,這意味著一個類可以有多個直接的超類。但是出于呼叫的目的super(),Python 總是線性化繼承層次以確定誰是“最好的”超類。這稱為方法決議順序,通過__mro__Python 中的變數訪問。
所以如果我們有類層次結構
class A(object): pass
class B(A): pass
class C(A): pass
class D(B, C): pass
那么雖然D有兩個超類,但如果我們說super()in D,它只會給我們B。那是因為 MRO 為D我們創建了一個線性層次結構。在 Python 3 中,它使用了一種稱為C3 resolution的演算法,它為我們提供了這種層次結構
>>> D.__mro__
(<class 'D'>, <class 'B'>, <class 'C'>, <class 'A'>, <class 'object'>)
因此,如果我們super()在 class 上呼叫方法D,我們將獲得 on 的版本B,如果我們super()從那里呼叫,我們將獲得C版本,然后是A版本,最后是版本object。
所以在你的情況下,C繼承自Aand B(按這個順序),所以它會偏向A. 也就是說,C您示例中該類的 MRO 是(C, A, B, object). 如果您希望它始終使用Bthen A,那么只需切換超類的順序即可。
class C(B, A):
...
這是最好的解決方案。這是可以預測的,Python 程式員會立即理解super()在這個類中呼叫的意圖。如果它符合您的需求,我推薦這個。
但是,如果您有一個復雜的多繼承系統并且需要同時訪問父類A和B超類,您總是可以直接使用類名呼叫它們,super()完全放棄呼叫。
class C(B, A):
def some_method(self):
A.some_method(self) # Calls A's version on self
B.some_method(self) # Calls B's version on self
如果some_method需要一些引數,您可以在顯式引數之后傳遞它們self。這將引起更多人的注意,因此如果您發現自己需要以復雜的方式訪問兩個不同的超類方法,您可能會考慮重構代碼以使用更少的多重繼承。但是,如果您真的需要,該功能就在那里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/459979.html
標籤:Python python-3.x 遗产 父母 多重继承
下一篇:關于如何創建子類的簡單問題?
