Python类实例共享相同的值

  • 本文关键字:共享 实例 Python python
  • 更新时间 :
  • 英文 :


我遇到了一些奇怪的事情。我定义了一些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接受可调用,并将在每次需要默认值时调用它。

最新更新