我希望像namedtuple._replace()
一样更改dataclass实例的属性,即创建一个修改过的原始对象副本:
from dataclasses import dataclass
from collections import namedtuple
U = namedtuple("U", "x")
@dataclass
class V:
x: int
u = U(x=1)
u_ = u._replace(x=-1)
v = V(x=1)
print(u)
print(u_)
print(v)
这将返回:
U(x=1)
U(x=-1)
V(x=1)
如何在dataclass对象中模仿这个功能?
init
和后初始化钩子的问题,但他们并没有重新审视设计并解决复杂性,而是选择通过增加复杂性来解决它。真正的故事是,如果你在某种方式下使用数据类,而它们不被视为完全无逻辑的容器,那么你正在错误地使用它们,并需要其他工具。例如,数据类的deepcopy
应该绝对零风险,除了对每个成员属性进行简单的深度复制,因此用户不会遇到任何意外情况。 - elyreplacec
作为“方法”而不是函数,因为这似乎嵌入了在调用代码中假定某些内容是数据类的假设。 - Att Righvalidate_triangle
—— 不要用一些简单的记录对象去膨胀其自我处理的职责。如果你因为某种(可疑的)面向对象的原因需要它,那么请使用类。几乎 任何 地方都比将该验证逻辑作为获取此类数据记录对象的任何用户可能认为是基本数据记录的晦涩实例创建的一部分更好。这让人想起了@property
,它也经常是一个糟糕的选择并被过度使用。 - ely