properties - 如何在数据类中覆盖 __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 开始),并且对于它找到的每个数据类,将来自该基类的字段添加到字段的有序映射。
那么正确的方法是什么?
解决方案
推荐阅读
- python - 将字节 -> 字符串 -> 转换回字节,并获取原始值
- firebase - Twilio 聊天用户 (Node.js) 友好名称在访问令牌创建期间未注册
- reactjs - 将 scss 中设置的全局字体应用于 Storybook 中的 Material UI 组件?
- javascript - 使用 render_template 重新渲染不起作用
- flutter - Flutter Build For Web - “无法编译应用程序”
- android - Android 隐式意图未显示正确的播放 mp4 文件的应用程序列表
- excel - 将工作表复制到另一个文件夹
- tcl - 如何在 ICC 中并行处理 foreach_in_collection?
- python - 如何从列表中生成随机数,而不重复最后一个?
- c - 通过指针获取数组长度