我遇到了一些奇怪的事情。我定义了一些Python类,当我从它们创建对象时,这些实例似乎具有相同的变量值。有人能帮我调试一下吗?
这里有一个最小的例子:
from dataclasses import dataclass, field
@dataclass
class Levels:
level_list: list = field(init=False)
def __post_init__(self):
self.level_list = []
def add(self, lvl):
self.level_list.append(lvl)
@dataclass
class Building:
levels: Levels = field(default=Levels())
b = Building() # instantiate
b.levels.add("Ground Floor")
print(b.levels) # >> Levels(level_list=['Ground Floor'])
c = Building() # instantiate another one
c.levels # >> Levels(level_list=['Ground Floor']) !!!
为什么c没有自己的Levels对象?
field(default=Levels())
这实际上在这里调用Levels()
一次,并使用其结果值(Levels
实例(作为每个Building
实例的默认值。
您想要的是为每个Building
实例创建一个新的Levels
实例,并使用default_factory
参数:
levels: Levels = field(default_factory=Levels)
default_factory
接受可调用,并将在每次需要默认值时调用它。