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
相关产品推荐
相关产品推荐

