Python多继承场景下如何正确初始化不同参数的父类?
多继承下不同父类的初始化解决方案
问题原因
在Python多继承中,super()是按照类的MRO(方法解析顺序)查找父类方法的。你的class C的MRO为[C, A, B, object],第二次调用super().__init__(b=b, d=d)时,依然会从MRO的当前位置找到A的__init__方法,而A的__init__仅接受a参数,因此触发参数错误。
解决方案
方案1:直接调用父类构造方法
不依赖super(),显式指定每个父类的__init__并传入对应参数:
class A: def __init__(self, a): print(f"A is init param={a}") class B: def __init__(self, b, d): print(f"B is init param={b} {d}") class C(A, B): def __init__(self, a, b, d): A.__init__(self, a) B.__init__(self, b, d) c = C(a=3, b=5, d=9)
运行后输出:
A is init param=3 B is init param=5 9
这种方式简单直接,适合继承关系不复杂的场景。
方案2:遵循MRO链式调用规范
修改父类的__init__方法,让它们接收额外关键字参数并传递给下一个父类,通过一次super()调用完成所有初始化:
class A: def __init__(self, a, **kwargs): print(f"A is init param={a}") super().__init__(**kwargs) class B: def __init__(self, b, d, **kwargs): print(f"B is init param={b} {d}") super().__init__(**kwargs) class C(A, B): def __init__(self, a, b, d): super().__init__(a=a, b=b, d=d) c = C(a=3, b=5, d=9)
运行结果与方案1一致。这种方式符合Python多继承设计规范,后续扩展子类时能保证初始化链的完整性。
内容的提问来源于stack exchange,提问作者Tung
相关产品推荐
相关产品推荐

