You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中super关键字初始化父类及MRO机制疑问

理解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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:16:20