Класс данных, вложенный в другой класс данных, не обновляет данные правильно - PullRequest
1 голос
/ 27 сентября 2019

Я генерирую два разных экземпляра питона 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 не тот инструмент?

Я отказываюсь считать благодарность пухом.Спасибо за всех, кто ответит, и за вашу благодарность тем, кто пытался его удалить.

1 Ответ

2 голосов
/ 27 сентября 2019

То, что вы сейчас делаете, это предоставление значения по умолчанию для поля.Поскольку это значение является изменяемым объектом, изменения в этом объекте будут видны всем экземплярам вашего класса данных.

Вместо этого вам следует предоставить фабрику по умолчанию , которая создает 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'))
...