多重继承中没使用super也可以调用父类方法吗?

本人构建了一个菱形问题的继承关系,对于 super 能够按照 MRO 调用父类方法是可以理解的,但是对于没使用 super 情况利用 self.pong() 也能够调用类 B 的方法苦思不解。下面是具体代码:

class A:
    def ping(self):
        print("A-ping:", self)

class B(A):
    def pong(self):
        print("B-pong:", self)

class C(A):
    def pong(self):
        print("C-PONG:", self)

class D(B, C):
    def ping(self):
        print("D-ping:", self)
        super().ping()
        
    def pingpong(self):
        self.ping()
        super().ping()
        self.pong()
        super(B, D).pong(self)
d = D()
d.pingpong()

其中 self.pong() 输出对应为:

B-pong: <__main__.D object at 0x000001B77096EAC8>

D 中没使用 super 也可以调用父类 Bpong 方法吗?
还是说我对类的继承理解的不好?请明白的前辈帮忙指点一下,感激不尽!!!

阅读 2.2k
2 个回答

继承是面向对象的重要特征之一,使得子类拥有了父类的公有变量和方法,这和是否使用super无关。
super主要是新式类中为了解决继承过程中的查找顺序(MRO)、重复调用等问题引入的办法。

只要你没有重写父类的方法,你不要利用super就可以,拥有父类B的方法,全继承过来,当然可以调用了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题