Python中super关键字初始化父类及MRO机制疑问
核心原因:方法解析顺序(MRO)决定了super()的调用目标
你观察到的现象完全符合Python的**方法解析顺序(Method Resolution Order, MRO)**规则,而super()正是基于这个顺序来决定要调用哪个父类的方法。
1. MRO是什么?
当一个类继承多个父类时,Python会为这个类生成一个线性的方法查找顺序。当你调用一个方法(比如__init__)时,Python会按照这个顺序依次查找,直到找到第一个实现了该方法的类。
2. super()的作用
super(Child, self).__init__()的作用是:根据Child类的MRO顺序,找到Child之后的第一个类,然后调用它的__init__方法。
3. 结合你的代码实例分析
情况1:继承顺序为class Child(Add, Sub, Mul, Sqroot, Div)
此时Child类的MRO顺序是:
Child → Add → Sub → Mul → Sqroot → Div → object
当你调用super(Child, self).__init__()时,会找到MRO中Child之后的第一个类Add,所以执行Add的__init__,输出Inside add class。
情况2:继承顺序为class Child(Sqroot, Add, Sub, Mul, Div)
此时Child类的MRO顺序变为:
Child → Sqroot → Add → Sub → Mul → Div → object
super()会找到MRO中Child之后的第一个类Sqroot,所以执行Sqroot的__init__,输出Inside sqroot class。
4. 如何查看类的MRO?
你可以在代码中添加一行来打印Child类的MRO,直观验证这个顺序:
print(Child.__mro__)
运行后会输出类似这样的元组,清晰展示方法查找的优先级顺序。
补充说明:如果父类也调用super()会怎样?
如果你的父类的__init__方法也调用了super().__init__(),那么Python会沿着MRO顺序依次执行后续类的__init__。比如修改Add的__init__:
class Add(object): def __init__(self): print 'Inside add class' super(Add, self).__init__()
此时运行Child实例,会依次输出Inside add class、Inside subtraction class、Inside multiplication class……直到所有父类的__init__都被执行(如果它们都调用了super的话)。
内容的提问来源于stack exchange,提问作者Amit Prajapati

