问题描述
我想创建一个类层次结构,其中类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
,而类field1
的defalt参数Sub
实际上在{{1}之后}。
不过,根据the docs on dataclass inheritence中的示例,子类中的字段将覆盖超类中的字段,但是保留了字段顺序。因此错误是有道理的。
这里是否有合适的解决方法,还是我必须手动实施所有操作?
解决方法
您可以使用@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