重新初始化嵌套数据类对象时遇到问题。
我有两个嵌套的数据类,设置如下:
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
的构造函数吗?如果没有,它在做什么,正确的方法是什么?
1条答案
按热度按时间4smxwvx51#
正如Michael所指出的,由
@dataclass
装饰器生成的构造函数包含一个可变的默认参数,因此当定义MyClass
时,MyNestedClass
的示例只创建一次,而不是对每个示例化都是唯一的。使用字段定义
MyClass
可解决此问题: