簡體   English   中英

Python:跳過基類之一的子類中的覆蓋方法

[英]Python: Overriding method in child class skipping one of the Base Class

我有兩個基類AB每個基類都有一個方法myfunc ,它打印出不同的字符。

class A:
    def myfunc(self):
        print('A')

class B:
    def myfunc(self):
        print('B')

我還有一個class C ,它繼承自AB 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

我的問題:

  1. 為什么要跳過class A
  2. 如何在A類和B類中執行myfunc方法

我查找了類似的討論,但發現它令人困惑。

回答問題1:

它跳過類 A 上的myFunc因為當您調用super.myFunc()時,python 所做的是在所有基類(在本例中為BA )中搜索名稱為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.

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