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本身的规则,核心原因有两个:
- 你的每个
__init__方法都是先执行super()调用,再执行print打印操作 - 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
相关产品推荐
相关产品推荐

