【问题标题】:Can I provide defaults for a subclass of a dataclass?我可以为数据类的子类提供默认值吗?
【发布时间】:2026-02-15 13:35:01
【问题描述】:

我想创建一个类层次结构,其中类Base 的所有对象都有一个字段field1,但不同的子类对field1 有不同的默认值。这些类是数据持有者,所以dataclasses 似乎是一个完美的库。

考虑以下 python 3.7+ 代码。

from dataclasses import dataclass, field
from typing import Any, Iterable

@dataclass
class Base:
    field1: Iterable[Any]

@dataclass
class Sub(Base):
    field2: Any
    field1: Iterable[Any] = field(default_factory=list)

代码失败,给我TypeError: non-default argument 'field2' follows default argument。这有点令人惊讶,因为field2 遵循超类的非默认field1,而Sub 类的默认参数field1 实际上位于field2 之后。

根据the docs on dataclass inheritence 中的示例,子类中的字段会覆盖超类中的字段,但会保留字段顺序。所以这个错误是有道理的。

这里有什么合适的解决方法,还是我必须手动实现所有东西?

【问题讨论】:

  • 嗯,最简单的解决方法是为 field2 添加一个默认值。如果这不适合您,则可以将 field2 声明为 InitVar,如果该字段未初始化,则在 post init 中引发异常。 field2: Any = None 应该可以解决您的问题。

标签: python python-dataclasses


【解决方案1】:

您可以使用@property 装饰器:

from dataclasses import dataclass
from typing import Any, Iterable

@dataclass
class Base:
    @property
    def field1(self) -> Iterable[Any]:
        return

@dataclass
class Sub(Base):
    field2: Any

    @property
    def field1(self) -> Iterable[Any]:
        return []  # or whatever default you want to put here

【讨论】:

    最近更新 更多