子类化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
相关产品推荐
相关产品推荐

