问题

我生成了两个不同的python dataclass实例,其中包括嵌套的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)和另一个实例(a)中的嵌套dataclass保持不变.

我究竟做错了什么,还是dataclass错误的工具?

我拒绝将感谢视为流利,感谢你们所有回答者,并向你们表示感谢。

  最佳答案

您目前正在做的是为字段提供一个默认值.由于该值是一个可变对象,对该对象的更改将可见于您的数据类的所有实例.

相反,您应该做的是提供一个默认工厂,为每个新的A实例生成sub1实例:

 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'))
 

  相同标签的其他问题

pythonpython-3.xpython-dataclasses