如何用super()实现Python多继承类调用所有父类带参__init__方法
多继承下用
super()调用多个父类的__init__方法 要让super()在多继承场景下正确触发所有父类的初始化方法,核心是让每个基类的__init__都参与到MRO(方法解析顺序)的调用链中——也就是每个基类处理完自己的参数后,要通过super()把剩余参数传递给下一个父类。
问题根源
你之前的代码只调用了一次super().__init__,但Base1的__init__没有继续调用super(),导致MRO链走到Base1就中断了,根本不会触发Base2的初始化逻辑。
解决方法:修改基类的__init__
调整两个基类,让它们在处理完自身参数后,通过super()传递剩余的关键字参数:
class Base1: def __init__(self, base_1: int, **kwargs): print(f"Base 1 initialized with base_1={base_1} and **kwargs={kwargs}") self._base_1: int = base_1 # 传递剩余参数给MRO链的下一个类 super().__init__(**kwargs) class Base2: def __init__(self, base_2: int, **kwargs): print(f"Base 2 initialized with base_2={base_2} and **kwargs={kwargs}") self._base_2: int = base_2 # 传递剩余参数(最终会到object,它的__init__不需要参数,空kwargs不影响) super().__init__(**kwargs)
然后子类只需要调用一次super(),把所有参数传进去即可:
class Child(Base1, Base2): def __init__(self, base_1: int, base_2: int): super().__init__(base_1=base_1, base_2=base_2)
测试执行child = Child(base_1=1, base_2=2),会输出:
Base 1 initialized with base_1=1 and **kwargs={'base_2': 2} Base 2 initialized with base_2=2 and **kwargs={}
如果无法修改基类怎么办?
如果这两个基类是第三方库的代码,你没法修改它们的__init__,那直接显式调用Base1.__init__(self, ...)和Base2.__init__(self, ...)就是最稳妥的方案——这种写法虽然看起来不那么"Pythonic",但在多继承且基类不配合MRO链的场景下,是完全合理的选择。
内容的提问来源于stack exchange,提问作者DarkNetFan
相关产品推荐
相关产品推荐

