super() 函数的调用是按照mro的解析顺序,可以参考下面的代码
import inspect
class A:
def test(self):
print('A')
class B:
def test(self):
print('B')
class C(A, B):
def __init__(self):
print(inspect.getmro(C)) # 查看mro的解析顺序
super().test() # 调用A类中的test方法
super(C, self).test() # 调用A类中的test方法
super(A, self).test() # 调用B类中的test方法
C()
运行结果如下
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
A
A
B
代码解释
1.super().test()调用的是MRO中当前类之后的第一个test方法,也就是A中的test方法,打印A。
2.super(C, self).test()这里再次指定从C的视角开始查找下一个test方法,依然找到的是A中的test方法,因此也打印A。
3.super(A, self).test()在这里,指定从A的视角开始查找下一个test方法,按照MRO,下一个是B中的test方法,因此打印B
ps:mro学习可以参考这篇文章 C3 线性化算法与 MRO - Kaiyuan's Blog | May the force be with me