Lud*_*igH 7 python python-dataclasses
我想创建一个类层次结构,其中类的所有对象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)
Run Code Online (Sandbox Code Playgroud)
代码失败,给了我TypeError: non-default argument 'field2' follows default argument. 这有点令人惊讶,因为遵循超类的field2非默认参数,而该类的默认参数实际上位于.field1field1Subfield2
根据有关数据类继承的文档中的示例,子类中的字段会覆盖超类中的字段,但保留字段顺序。所以这个错误是有道理的。
这里有任何合适的解决方法,还是我必须手动实现所有内容?
您可以使用@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
Run Code Online (Sandbox Code Playgroud)