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

问题描述

我想创建一个类层次结构,其中类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