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

如何为继承含默认属性的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:55:31