Python:子类中的重写方法跳过基类之一

Python:子类中的重写方法跳过基类之一,python,class,oop,overriding,Python,Class,Oop,Overriding,我有两个基类A和B,每个基类都有一个方法myfunc,可以打印出不同的字符 A类: def myfunc(自我): 打印('A') B类: def myfunc(自我): 打印('B') 我还有一个类C,它继承自A和B。在C类中,我覆盖了myfunc并调用了super C类(B、A): def myfunc(自我): super().myfunc() 现在,如果我执行下面的代码,它只打印一个字符 x=C() x、 myfunc() 输出: B 我尝试了print(C.\uu mro\uu

我有两个基类
A
B
,每个基类都有一个方法
myfunc
,可以打印出不同的字符

A类:
def myfunc(自我):
打印('A')
B类:
def myfunc(自我):
打印('B')
我还有一个
类C
,它继承自
A
B
。在
C类
中,我覆盖了
myfunc
并调用了
super

C类(B、A):
def myfunc(自我):
super().myfunc()
现在,如果我执行下面的代码,它只打印一个字符

x=C()
x、 myfunc()
输出:

B
我尝试了
print(C.\uu mro\uuuu)
,这给了我
(,)
,所以它应该转到
A类
并打印字符
A
。对吧?

另外,如果我像
C(A,B)
那样切换继承顺序,并使用相同的代码,它将跳过
类B

我的问题:

  • 为什么它跳过了A类
  • 如何在类
    A
    B
    中执行
    myfunc
    方法
  • 我查了一下,但发现它令人困惑。

    回答问题1:

    它跳过类A上的
    myFunc
    ,因为python在调用
    super.myFunc()
    时所做的是在所有基类(在本例中是
    B
    A
    )中搜索名为
    myFunc
    的第一个函数,并且它是按顺序执行的,因此它首先在类
    B
    中查找
    myFunc>。因此,因为类
    B
    python中有一个名为
    myFunc
    的函数,所以请停止搜索并仅执行该函数

    回答问题2:

    有一种简单的方法可以做到这一点:

    A类:
    def f(自我):
    打印('A')
    B类:
    def f(自我):
    打印('B')
    C类(B、A):
    def f(自我):
    A.f(自我)
    B.f(自我)
    c=c()
    c、 f()
    
    基本上,您可以调用任何类的任何函数,然后将实例作为第一个参数传递(
    self
    )。我相信你不能只用一次调用就同时执行两个函数,你需要为每个函数调用一次