我可以为数据类的子类提供默认值吗?

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

根据有关数据类继承的文档中的示例,子类中的字段会覆盖超类中的字段,但保留字段顺序。所以这个错误是有道理的。

这里有任何合适的解决方法,还是我必须手动实现所有内容?

Ben*_*ine 1

您可以使用@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)