猿问

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

我有两个基类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。

我的问题:

  1. 为什么会跳过class A

  2. 如何 在两个类中执行myfunc方法AB

我查阅了 类似的讨论,但发现它令人困惑。


慕妹3242003
浏览 158回答 1
1回答

达令说

回答问题1:它会跳过myFuncA 类,因为当您调用时,pythonsuper.myFunc()会搜索myFunc所有基类中具有名称的第一个函数(在本例中为B和A),并且它按顺序执行此操作,因此它首先myFunc在 class 中查找B。因此,因为pythonmyFunc类中有一个名为的函数,所以停止搜索并仅执行该函数。B回答问题2:有一个简单的方法可以做到这一点:class A:&nbsp; &nbsp; def f(self):&nbsp; &nbsp; &nbsp; &nbsp; print('A')class B:&nbsp; &nbsp; def f(self):&nbsp; &nbsp; &nbsp; &nbsp; print('B')class C(B, A):&nbsp; &nbsp; def f(self):&nbsp; &nbsp; &nbsp; &nbsp; A.f(self)&nbsp; &nbsp; &nbsp; &nbsp; B.f(self)c = C()c.f()基本上,您可以调用任何类的任何函数,然后将实例作为第一个参数 ( self) 传递。我相信您无法仅通过一次调用来执行这两个函数,您需要对每个函数进行一次调用。
随时随地看视频慕课网APP

相关分类

Python
我要回答