繁体   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