我生成了包含嵌套dataclass
的python dataclass
的两个不同实例。当我在一个实例中(但不在另一个实例中)更新嵌套dataclass
中的值时,两个实例中的嵌套dataclass
中都放置了相同的数据。这不是我所期望的。
from dataclasses import dataclass
@dataclass
class sub1:
q: int = 10
r: str = "qrst"
@dataclass
class A:
a: int = 1
s1: sub1 = sub1()
if __name__ == '__main__':
a = A()
aa = A()
aa.a = 9
aa.s1.r = "92"
print("a:", repr(a))
print("aa:", repr(aa))
''' Produces --
a: A(a=1, s1=sub1(q=10, r='92'))
aa: A(a=9, s1=sub1(q=10, r='92'))
'''
我希望嵌套的
dataclass
仅在指定的实例(aa
)中被更新,而另一个实例(dataclass
)中的嵌套a
则保持不变。我在做什么错,还是
dataclass
是错误的工具?我拒绝把感谢当作绒毛。感谢所有回答,并感谢所有尝试删除它的人。
最佳答案
您当前正在做的是为该字段提供默认值。由于该值是可变对象,因此对该对象的更改将对数据类的所有实例可见。
您应该做的是提供一个default factory,为每个新的sub1
实例生成A
实例:
from dataclasses import field
@dataclass
class A:
a: int = 1
s1: sub1 = field(default_factory=sub1)
a = A()
aa = A()
aa.a = 9
aa.s1.r = "92"
print("a:", repr(a)) # a: A(a=1, s1=sub1(q=10, r='qrst'))
print("aa:", repr(aa)) # aa: A(a=9, s1=sub1(q=10, r='92'))