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

Python多重继承场景下如何调用父类的super构造函数?

Python多继承父类构造调用方案

方案1:显式调用父类构造方法(推荐新手/简单继承场景使用)

直接通过父类名绑定调用构造方法,主动传入self实例和对应参数即可,逻辑清晰无歧义,不需要修改原有父类代码。
修改后的C类代码如下:

class C(A, B):
    def __init__(self, a1, a2, b):
        print('C.__init__')
        # 调用A类构造
        A.__init__(self, a1, a2)
        # 调用B类构造
        B.__init__(self, b)

该方案优势:不需要理解MRO(方法解析顺序)规则,参数传递完全可控,不会出现参数匹配错误的问题。

方案2:使用super()协作式继承(适合复杂继承链场景)

Python的super()会按照MRO顺序调用继承链上的下一个方法,需要调整父类构造支持接收额外关键字参数,将剩余参数传递给后续的继承链调用:

class A:
    def __init__(self, a1, a2, **kwargs):
        print('A.__init__')
        super().__init__(**kwargs)
        self.a1 = a1
        self.a2 = a2

class B:
    def __init__(self, b, **kwargs):
        print('B.__init__')
        super().__init__(**kwargs)
        self.b = b

class C(A, B):
    def __init__(self, a1, a2, b):
        print('C.__init__')
        # 传入所有参数,super会按MRO顺序自动分发给对应父类
        super().__init__(a1=a1, a2=a2, b=b)

可以执行print(C.mro())查看当前类的继承顺序为[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>],参数会沿着继承链逐层传递。

注意事项

  • 继承层级少、父类逻辑独立的场景优先选择显式调用方案,可读性更高
  • 使用super()方案必须保证继承链上所有类的构造都正确传递**kwargs,否则会出现参数丢失报错
  • 两种方案最终都能正确完成父类属性的初始化,可根据实际项目场景选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:57:03