将类重构到抽象基类后出现__init__参数数量不匹配错误求助
问题分析与解决方案
错误的核心原因是:重构后子类my_class的__init__方法没有正确处理抽象基类base所需的var1、var2参数,导致位置参数传递时数量不匹配。以下分两种常见场景给出解决方法:
场景1:基类base用attrs库定义(推荐,保持代码风格一致)
如果基类和子类都用attrs定义,attrs会自动处理父类属性的初始化逻辑,无需手动编写__init__。
import attr from abc import ABC # 抽象基类,包含var1、var2 @attr.s class base(ABC): var1 = attr.ib() var2 = attr.ib() # 子类继承base,保留var3 @attr.s class my_class(base): var3 = attr.ib() @classmethod def func(cls): # 按var1、var2、var3的顺序传递位置参数 return cls(1, 2, 3) # 测试调用 obj = my_class.func() print(obj.var1, obj.var2, obj.var3) # 输出:1 2 3
场景2:基类base手动实现__init__
如果基类必须手动编写__init__(而非用attrs),需要在子类中显式实现__init__,手动调用父类的初始化方法并传递参数:
import attr from abc import ABC class base(ABC): def __init__(self, var1, var2): self.var1 = var1 self.var2 = var2 @attr.s(init=False) # 禁用attrs自动生成的__init__ class my_class(base): var3 = attr.ib() def __init__(self, var1, var2, var3): super().__init__(var1, var2) # 调用父类初始化方法 self.var3 = var3 @classmethod def func(cls): return cls(1, 2, 3) # 测试调用 obj = my_class.func() print(obj.var1, obj.var2, obj.var3) # 输出:1 2 3
关键注意点
- 若使用attrs定义父类和子类,确保不要给子类添加
kw_only=True等会强制关键字参数的配置,否则无法用位置参数传递父类属性。 - 若手动实现父类
__init__,必须在子类中显式处理父类的参数传递,避免attrs生成的默认__init__忽略父类的参数要求。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

