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

Python中多继承的父类参数传递问题

问题原因

你当前的代码报错是因为:

  • 父类A的__init__需要2个位置参数(a、b),父类B的__init__需要3个位置参数(c、d、e)
  • 当调用AB(1,2,3)时,*args会把这3个参数同时传给A和B的__init__:
    • 传给A时,A的__init__收到self,1,2,3,超出了它需要的参数数量,直接抛出TypeError
    • 就算参数数量够,也会出现参数混淆的问题(比如把本该给B的参数传给A)
解决方法

方法1:明确传递对应参数(最直观)

直接在AB的__init__中定义所有需要的参数,分别传给两个父类:

class A:
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def testa(self):
        print('inside A')
class B:
    def __init__(self,c,d,e):
        self.c = c
        self.d = d
        self.e = e
    def testb(self):
        print('inside B')

class AB(A,B):
    def __init__(self, a, b, c, d, e):
        # 传给A需要的a、b
        A.__init__(self, a, b)
        # 传给B需要的c、d、e
        B.__init__(self, c, d, e)

# 创建实例时按顺序传入所有参数
obj = AB(1, 2, 3, 4, 5)
print(obj.a, obj.b, obj.c, obj.d, obj.e)  # 输出:1 2 3 4 5
obj.testa()  # 输出:inside A
obj.testb()  # 输出:inside B

方法2:使用关键字参数(避免顺序混淆)

如果参数较多,用关键字参数更清晰,不容易搞混顺序:

class AB(A,B):
    def __init__(self, **kwargs):
        # 从kwargs中提取A需要的参数
        a = kwargs.pop('a')
        b = kwargs.pop('b')
        A.__init__(self, a, b)
        # 剩下的kwargs传给B
        B.__init__(self, **kwargs)

# 创建实例时用关键字指定参数
obj = AB(a=1, b=2, c=3, d=4, e=5)

方法3:利用super()实现多继承链(适合复杂场景)

如果后续有更多继承层级,可以修改父类的__init__来支持super调用链,这样AB只需调用一次super:

class A:
    def __init__(self,a,b,**kwargs):
        super().__init__(**kwargs)  # 调用MRO链中的下一个类的__init__
        self.a = a
        self.b = b
    def testa(self):
        print('inside A')
class B:
    def __init__(self,c,d,e,**kwargs):
        super().__init__(**kwargs)
        self.c = c
        self.d = d
        self.e = e
    def testb(self):
        print('inside B')

class AB(A,B):
    def __init__(self,a,b,c,d,e):
        super().__init__(a=a,b=b,c=c,d=d,e=e)

obj = AB(1,2,3,4,5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:50:39