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

Python多继承中super方法的隐式参数规则与执行顺序问题

问题解答

所有回答的核心前提:Python的super本质基于**方法解析顺序(MRO)**工作,不是简单查找当前类的父类,而是查找当前实例对应MRO链中指定类的下一个类。

1. super()省略参数的传递规则

是。Python3中,在类的普通实例方法内直接调用无参的super(),解释器会自动隐式传入两个参数:第一个是当前方法所属的类,第二个是实例对象self,等价于手动写super(当前类名, self)。
你之前写super(self)报错,是因为super的第一个参数要求是类对象,而self是类的实例,类型不匹配才触发TypeError。

2. 可参考的权威学习资料

  • Python官方文档的内置函数板块中super()的条目,以及语言参考中「方法解析顺序」相关章节
  • 经典Python教材《流畅的Python》第12章「继承的优缺点」中关于多继承和super的专门讲解
  • 你已经找到的super considered super是Python核心开发者撰写的科普文章,本身就是权威资料之一

3. 初始化方法调用顺序的底层逻辑

你看到的「输出顺序和继承列表相反」是方法执行逻辑的巧合,不是super本身的规则,核心原因有两个:

  1. 你的每个__init__方法都是先执行super()调用,再执行print打印操作
  2. super的查找顺序完全遵循当前实例的MRO链

拿第一个示例说明:class Third(Second, First)时,Third实例的MRO链是[Third, Second, First, object],执行Third()的流程为:

  • 进入Third.__init__,调用super()触发MRO中下一个类Second的__init__
  • 进入Second.__init__,调用super()触发MRO中下一个类First的__init__
  • 进入First.__init__,调用super()触发MRO中下一个类object的__init__(无输出)
  • 回到First.__init__执行后续代码,打印first
  • 回到Second.__init__执行后续代码,打印second
  • 回到Third.__init__执行后续代码,打印third

所以输出顺序是first→second→third。当你把继承顺序改为class Third(First, Second),MRO链变为[Third, First, Second, object],按照同样的流程执行,打印顺序就变成了second→first→third,本质是调用链入栈和出栈的顺序导致的打印逆序,和继承列表本身没有直接的相反关系,完全由MRO和方法内的代码顺序决定。


内容的提问来源于stack exchange,提问作者Brakke Baviaan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:15:04