本人构建了一个菱形问题的继承关系,对于 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
也可以调用父类 B
的 pong
方法吗?
还是说我对类的继承理解的不好?请明白的前辈帮忙指点一下,感激不尽!!!
继承是面向对象的重要特征之一,使得子类拥有了父类的公有变量和方法,这和是否使用super无关。
super主要是新式类中为了解决继承过程中的查找顺序(MRO)、重复调用等问题引入的办法。