为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3242003 2023-10-06 16:38:04
我有两个基类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。我的问题:为什么会跳过class A?如何 在两个类中执行myfunc方法AB我查阅了 类似的讨论,但发现它令人困惑。
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

回答问题1:


它会跳过myFuncA 类,因为当您调用时,pythonsuper.myFunc()会搜索myFunc所有基类中具有名称的第一个函数(在本例中为B和A),并且它按顺序执行此操作,因此它首先myFunc在 class 中查找B。因此,因为pythonmyFunc类中有一个名为的函数,所以停止搜索并仅执行该函数。B


回答问题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) 传递。我相信您无法仅通过一次调用来执行这两个函数,您需要对每个函数进行一次调用。


查看完整回答
反对 回复 2023-10-06
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信