繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM