super()是一个内置类,用于在继承链中动态调用mro中“当前类之后的下一个类”的方法;它支持零参写法,确保单继承中父类初始化正确执行,多继承中按mro顺序协作调用,且self始终为原始实例。

super() 不是关键字,而是一个内置类,它的作用是在继承链中动态调用 MRO(方法解析顺序)中“当前类之后的下一个类”的方法。它让子类能安全、灵活地复用父类逻辑,尤其在多继承场景下,比硬编码父类名更可靠。
单继承中怎么用 super()
最常见的是在 __init__ 中初始化父类属性:
- 子类 必须显式调用 super().__init__(),否则父类的初始化逻辑不会自动执行
- 调用位置通常放在子类 __init__ 开头,确保父类状态先就绪
- Python 3 支持零参数写法 super().__init__(...),等价于 super(当前类, self).__init__(...)
多继承中 super() 的执行顺序怎么理解
super() 不是简单“找直接父类”,而是严格按当前类的 MRO 列表 向后查找:
- 用 Class.mro() 可查看实际顺序,比如 D(B, C) 的 MRO 是 [D, B, C, A, object]
- 每个类中的 super().__init__() 都会触发 MRO 中“下一个类”的同名方法
- 所有参与协作的类都必须统一使用 super(),否则调用链会中断或重复
super() 调用时的 self 是谁
这是容易误解的关键点:
- super().method() 中的 self 始终是原始调用者实例(比如 b = B() 中的 b)
- 被调用的父类方法里操作的 self.n,其实是子类实例的属性,不是父类新建的对象
- 所以 super().add(2) 在子类中执行,最终修改的是子类实例的 n 值
什么时候不能用 super() 直接替代父类名调用
虽然推荐用 super(),但以下情况需注意:
- 父类方法签名与子类不兼容,且你无法控制父类定义时,硬编码调用更可控
- 想绕过 MRO、明确指定某个特定父类(非协作式继承),此时用 ParentClass.method(self, ...)
- 静态方法或类方法中使用 super(),需传参:如 super(CurrentClass, cls).classmethod_name()










