[英]Can I provide defaults for a subclass of a dataclass?
我想创建一个 class 层次结构,其中 class 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
,而 class Sub
的默认参数field1
实际上位于field2
之后。
根据 数据类继承文档中的示例,子类中的字段覆盖超类中的字段,但保留了字段顺序。 所以这个错误是有道理的。
这里有什么合适的解决方法,还是我必须手动实现所有东西?
您可以使用 @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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.