Python:子 class 中的重写方法跳过了一个 Base Class

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. 如何在类AB
  3. 中执行myfunc方法

我查了一下 但发现它很混乱。

回答问题 1:

它正在跳过 class A 上的 myFunc 因为当您调用 super.myFunc() 时 python 所做的是在中搜索名称为 myFunc 的第一个函数所有基数 classes(在本例中为 BA)并按顺序执行,因此它首先在 class B。所以,因为在 class B python 中有一个名为 myFunc 的函数,所以停止搜索并只执行它。

回答问题 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()

基本上你可以调用任何 class 的任何函数,然后将实例作为第一个参数传递 (self)。我相信你不能只用一次调用来执行这两个函数,你需要为每个函数调用一次。