如何解决我可以为数据类的子类提供默认值吗?
我想创建一个类层次结构,其中类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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。