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

Python多继承中子类实例化时父类构造函数未被调用的问题

Python多重继承下父类构造函数未触发的解决方法

问题说明

你定义了三个Python类a、b、c,其中c继承自a和b。实例化c时,只有c的构造函数被调用,而a、b的构造函数未执行,不符合预期的执行顺序。

原代码

class a:
    def __init__(self):
        print("初始化a")
class b:
    def __init__(self):
        print("初始化b")
class c(a,b):
    def __init__(self):
        print("初始化c")
e=c()

实际输出

初始化c

预期输出

初始化a
初始化b
初始化c

解决思路与方案

Python中,子类一旦重写__init__方法,默认不会自动调用父类的构造函数,必须显式触发才能执行父类的初始化逻辑。针对多重继承场景,有两种可行方式:

方式1:直接调用父类构造函数

在子类c的__init__里,直接通过父类名称调用其__init__,并传入当前实例self。这种方式可以严格控制父类构造函数的执行顺序:

class a:
    def __init__(self):
        print("初始化a")
class b:
    def __init__(self):
        print("初始化b")
class c(a,b):
    def __init__(self):
        a.__init__(self)
        b.__init__(self)
        print("初始化c")
e=c()

运行后输出:

初始化a
初始化b
初始化c

方式2:使用super()适配MRO机制

Python 3的super()会遵循**方法解析顺序(MRO)**调用父类方法,但需要所有父类的__init__也配合使用super(),才能确保所有父类构造函数都被触发:

class a:
    def __init__(self):
        super().__init__()
        print("初始化a")
class b:
    def __init__(self):
        print("初始化b")
class c(a,b):
    def __init__(self):
        super().__init__()
        print("初始化c")
e=c()

运行后输出:

初始化b
初始化a
初始化c

这里的输出顺序由c的MRO([c, a, b, object])决定,a的__init__中调用super()会指向b的__init__,从而触发所有父类的初始化逻辑。如果需要固定a→b的执行顺序,直接调用父类构造函数的方式更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:07:31