【发布时间】: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应该可以解决您的问题。