今天趁着闲暇时间较多,把python中的多重继承复习了一下。由于多重继承本身具有复杂性,所以在java中没有提供多重继承,同样的在python中多重继承也使用的非常少。
在所有实现多重继承的语言中,均要解决潜在的命名冲突,这种冲突是由不相关祖先类所实现的同名方法实现的同名方法引起的。给个示例:
class A:
def ping(self):
print('ping', self)
class B(A):
def pong(self):
print('pong', self)
class C(A):
def pong(self):
print('PONG', self)
class D(B, C):
def ping(self):
super().ping()
print('post-ping', self)
def pingpong(self):
self.ping()
super().ping()
self.pong()
super().pong()
C.pong(self)
在这个多重继承中,来分析方法解析顺序:
利用__mro__来审查方法解析顺序:
画成如下的解析顺序图:
看看D实例上调用pingpong方法得到的结果:
可以看到
self.ping()
super().ping()
均调用了A的ping(),而
self.pong()
super().pong()
则调用了B的pong(),
C.pong(self)
则直接调用了C的方法。
发现当一个类同时继承多个类时,其搜寻方法的顺序是与,在创建该类继承祖先类的顺序相关的。