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

将类重构到抽象基类后出现__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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:17:23