首页 > 解决方案 > 嵌套在另一个数据类中的数据类不能正确更新数据

问题描述

我生成了两个不同的 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) 中更新,而嵌套dataclass在另一个实例 ( a) 中保持不变。

我做错了什么,或者是dataclass错误的工具?

我拒绝将感谢视为无稽之谈。感谢所有回答的人,以及试图删除它的人。

标签: pythonpython-3.xpython-dataclasses

解决方案


您当前所做的是为该字段提供默认值。由于该值是可变对象,因此对该对象的更改将对数据类的所有实例可见。

您应该做的是提供一个默认工厂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'))

推荐阅读