python 重新初始化DataClass对象不会重新初始化嵌套的DataClass对象

4nkexdtk  于 2023-05-27  发布在  Python
关注(0)|答案(1)|浏览(184)

重新初始化嵌套数据类对象时遇到问题。
我有两个嵌套的数据类,设置如下:

from dataclasses import dataclass, field
from typing import Dict

@dataclass
class MyNestedClass():
    field1: str = ""
    field2: int = 0
    field3: Dict[str, float] = field(default_factory=dict)

@dataclass
class MyClass():
    field1: str = ""
    field2: int = 0
    field3: Dict[str, float] = field(default_factory=dict)
    field4: MyNestedClass = MyNestedClass()

作为单元测试过程的一部分,我想初始化一个新的MyClass对象,然后运行一个测试。不过,我注意到了一些奇怪的事情。当我重新初始化MyClass对象时,它以某种方式记住了field4的内容。例如:

my_obj = MyClass()
print(my_obj)

my_obj.field2 = 1
my_obj.field3 = {'something': 2.5}
my_obj.field4.field1 = "B"
my_obj.field4.field2 = 2
my_obj.field4.field3 = {'something else': 3.14}
print(my_obj)

my_obj = MyClass()
print(my_obj)

产量

MyClass(field1='', field2=0, field3={}, field4=MyNestedClass(field1='', field2=0, field3={}))
MyClass(field1='', field2=1, field3={'something': 2.5}, field4=MyNestedClass(field1='B', field2=2, field3={'something else': 3.14}))
MyClass(field1='', field2=0, field3={}, field4=MyNestedClass(field1='B', field2=2, field3={'something else': 3.14}))

默认情况下,MyClass的自动生成的数据类构造函数不会调用MyNestedClass的构造函数吗?如果没有,它在做什么,正确的方法是什么?

4smxwvx5

4smxwvx51#

正如Michael所指出的,由@dataclass装饰器生成的构造函数包含一个可变的默认参数,因此当定义MyClass时,MyNestedClass的示例只创建一次,而不是对每个示例化都是唯一的。
使用字段定义MyClass可解决此问题:

@dataclass
class MyClass():
    field1: str = ""
    field2: int = 0
    field3: Dict[str, float] = field(default_factory=dict)
    field4: MyNestedClass = field(default_factory=MyNestedClass)

相关问题