【发布时间】:2021-04-30 02:03:37
【问题描述】:
假设我有一个带有 set 方法的数据类。如何扩展 repr 方法,以便在调用 set 方法时它也会更新:
from dataclasses import dataclass
@dataclass
class State:
A: int = 1
B: int = 2
def set(self, var, val):
setattr(self, var, val)
例如:
In [2]: x = State()
In [3]: x
Out[3]: State(A=1, B=2)
In [4]: x.set("C", 3)
In [5]: x
Out[5]: State(A=1, B=2)
In [6]: x.C
Out[6]: 3
我想要的结果
In [7]: x
Out[7]: State(A=1, B=2, C=3)
【问题讨论】:
-
您是否还需要扩展
__init__方法以使State(A=1, B=2, C=3)成为有效的构造函数调用?或者,如果您的__repr__方法为您提供了一个您不能eval到相同对象的字符串,是否可以? -
这不应该是
dataclass;各种各样的事情都会破裂。你知道types.SimpleNamespace吗? -
我觉得后者应该没问题。我在想的方式是我用不同的状态调用初始化的几个属性初始化另一个类模型。然后我从 Model 运行一些方法,我想在 State 创建的每个属性中创建一些新属性。
-
@o11c: 为什么它不应该是一个数据类?我使用它来存储某些模型的参数可能会在以后更新。我想一种方法是在初始化时定义参数,而不是稍后设置。
-
我认为令人困惑的是,如果您在运行时扩展字段(例如,在定义类之后添加
C属性),那么您不会处理类似记录的数据(具有固定字段)。相反,您的数据是动态的。没关系,这不是dataclasses的用途。