【发布时间】:2021-09-24 19:01:14
【问题描述】:
我有一个简单的 Python 类,看起来像这样:
class RegularVariable:
def __init__(self, num_states):
self.num_states = num_states
我最近发现了 dataclasses 模块并将我的简单类替换为如下数据类:
@dataclass(frozen=True)
class DataClassVariable:
num_states: int
(设置frozen=True 是因为我确实希望该类是只读的。)
现在,在我的代码中,我需要使用完全相同的num_states 创建一堆此类的实例。我可以使用旧的、简单的 RegularVariable 类轻松地做到这一点:
print(len(set([RegularVariable(1) for _ in range(10)])))
# prints 10 as expected
但是,当我用我的 dataclass 版本尝试同样的事情时:
print(len(set([DataClassVariable(1) for _ in range(10)])))
# prints 1
为什么dataclass 会这样?鉴于此,我怎样才能为我的DataClassVariable 创建 10 个不同的对象(实例化)?
【问题讨论】:
-
我听说数据类默认不实现任何唯一的哈希,所以如果你没有实现一种方法来区分每个实例,因为你对所有实例都使用相同的值,
set可能实际上认为也许都是同一个例子。如果我错了,请纠正我,我会删除它;-) -
DataClassVariable的每个实例都具有相同的哈希值(我认为,仅基于其num_states属性的值),因此您的集合确实只有一个DataClassVariable实例它。 -
@DevLounge:如果你指定
frozen=True,数据类做默认实现__hash__和__eq__。这就是发生这种情况的原因 - 否则,您会收到10。 -
好吧,我说的不是太远,但也不对 ;-)
-
没有选项可以简单地说“不要覆盖继承的
__hash__函数”,这似乎很奇怪。
标签: python python-3.7 python-dataclasses