如何为继承含默认属性的dataclass子类添加非默认属性?
Dataclass子类添加非默认属性的解决方案
当继承含默认属性的dataclass时,直接添加非默认属性会触发Non-default property follows a default property错误,原因是自动生成的__init__中子类非默认属性会排在父类默认属性之后,违反Python参数规则。以下是几种可行的解决方法:
方法一:手动定义__init__方法
完全自定义初始化逻辑,控制参数顺序,将子类的非默认属性放在最前面:
from dataclasses import dataclass @dataclass class A: a: int b: int = 5 @dataclass class B(A): c: int def __init__(self, c: int, a: int, b: int = 5): super().__init__(a=a, b=b) self.c = c
实例化示例:B(c=3, a=1) 或 B(3, 1, b=6)
方法二:使用kw_only=True(Python 3.10+)
通过kw_only=True标记子类,强制所有属性通过关键字参数传递,避免参数顺序冲突:
from dataclasses import dataclass @dataclass class A: a: int b: int = 5 @dataclass(kw_only=True) class B(A): c: int
实例化示例:B(a=1, c=2) 或 B(c=2, a=1, b=6)
方法三:调整父类结构
如果允许修改父类,将默认属性移到子类,让父类仅保留非默认属性:
from dataclasses import dataclass @dataclass class A: a: int @dataclass class B(A): c: int b: int = 5
这样子类属性顺序符合Python参数规则,不会触发错误,实例化示例:B(1, 3) 或 B(a=1, c=3, b=7)
方法四:通过可变参数兼容父类参数
利用*args和**kwargs接收父类参数,确保子类非默认属性优先:
from dataclasses import dataclass @dataclass class A: a: int b: int = 5 @dataclass class B(A): c: int def __init__(self, c: int, *args, **kwargs): super().__init__(*args, **kwargs) self.c = c
实例化示例:B(3, 1)(c=3,a=1,b用默认值5)或 B(3, 1, b=6)
内容的提问来源于stack exchange,提问作者Damian
相关产品推荐
相关产品推荐

