[英]Python: Overriding method in child class skipping one of the Base Class
我有兩個基類A
和B
每個基類都有一個方法myfunc
,它打印出不同的字符。
class A:
def myfunc(self):
print('A')
class B:
def myfunc(self):
print('B')
我還有一個class C
,它繼承自A
和B
在class C
我覆蓋了myfunc
並對其調用了super
。
class C(B, A):
def myfunc(self):
super().myfunc()
現在,如果我執行以下代碼,它只會打印一個字符
x = C()
x.myfunc()
輸出:
B
我試過print(C.__mro__)
這給了我(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
所以它應該去到class A
並打印字符A
對?
此外,如果我像C(A,B)
那樣切換繼承順序並使用相同的代碼,它會跳過class B
。
我的問題:
class A
?A
類和B
類中執行myfunc
方法我查找了類似的討論,但發現它令人困惑。
回答問題1:
它跳過類 A 上的myFunc
因為當您調用super.myFunc()
時,python 所做的是在所有基類(在本例中為B
和A
)中搜索名稱為myFunc
的第一個函數,並按順序執行此操作,因此它首先在B
類中查找myFunc
。 因此,因為B
類中有一個名為myFunc
的函數,所以 python 停止搜索並僅執行該函數。
回答問題2:
有一種簡單的方法可以做到這一點:
class A:
def f(self):
print('A')
class B:
def f(self):
print('B')
class C(B, A):
def f(self):
A.f(self)
B.f(self)
c = C()
c.f()
基本上你可以調用任何類的任何函數,然后將實例作為第一個參數( self
)傳遞。 我相信你不能只用一個調用來執行這兩個函數,你需要為每個函數調用一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.