首页 > 解决方案 > 如何在数据类中覆盖 __getattribute__ 和 __setattr__

问题描述

我正在尝试覆盖数据类的__getattr__and__setattr__方法。对于单个对象,它都按预期工作,但每个其他实例都继承自第一个实例。

from dataclasses import dataclass, field
from typing import List, ClassVar


@dataclass
class StatusInfo:

    details: ClassVar[List[str]] = []
    exit_code: SimulationExitCode = None
    text: str = ""

    def __getattribute__(self, name):
        if name == "text":
            return "---".join(self.details)
        else:
            return super().__getattribute__(name)

    def __setattr__(self, name, value):
        if name == "text":
            self.details.extend([value])
        else:
            return super().__setattr__(name, value)

控制台输出

from api.info import StatusInfo
s = StatusInfo(text='as')
StatusInfo(exit_code=None, text='as')
ss = StatusInfo(text='hhh')
StatusInfo(exit_code=None, text='as------hhh')

我怀疑这与数据类继承的工作方式有关。该文件指出

当 dataclass() 装饰器创建数据类时,它会在反向 MRO 中查看该类的所有基类(即从 object 开始),并且对于它找到的每个数据类,将来自该基类的字段添加到字段的有序映射。

那么正确的方法是什么?

标签: propertiespython-3.7python-dataclasses

解决方案


推荐阅读