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

子类化dataclass时无法覆盖默认参数问题咨询

子类化dataclass时无法覆盖默认关键字参数的问题解决

你的代码中出现的问题是因为子类未添加@dataclass装饰器,导致Python没有为子类生成新的构造方法,实例化时依然调用父类的__init__,所以使用的是父类的默认值。

问题复现代码

from dataclasses import dataclass

@dataclass
class D1:
    name: str = "foo"
class D2(D1):
    name: str = "bar"
print(D2().name == "foo")  # 输出True,不符合预期

解决方法

方法1:给子类添加@dataclass装饰器

这是最直接的解决方案,装饰器会为子类生成新的__init__方法,覆盖父类的默认参数:

from dataclasses import dataclass

@dataclass
class D1:
    name: str = "foo"

@dataclass
class D2(D1):
    name: str = "bar"

print(D2().name == "bar")  # 输出True,符合预期

方法2:使用field显式指定默认值

如果需要对字段进行更精细的控制,可以用dataclasses.field来定义子类的默认值,同样需要给子类添加@dataclass:

from dataclasses import dataclass, field

@dataclass
class D1:
    name: str = "foo"

@dataclass
class D2(D1):
    name: str = field(default="bar")

print(D2().name == "bar")  # 输出True

方法3:手动重写__init__方法

如果有特殊需求,也可以手动重写子类的构造方法,显式传入自定义默认值:

from dataclasses import dataclass

@dataclass
class D1:
    name: str = "foo"

class D2(D1):
    def __init__(self, name: str = "bar"):
        super().__init__(name)

print(D2().name == "bar")  # 输出True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:15:01