【发布时间】:2011-02-01 16:57:49
【问题描述】:
我有一个想要变成集合的对象列表。我的对象包含一些字段,其中一些是o.id 和o.area。如果这两个字段相同,我希望两个对象相等。即:o1==o2 当且仅当o1.area==o2.area and o1.id==o2.id。
我尝试改写 __eq__ 和 __cmp__ 但我收到错误:TypeError: unhashable instance。
我应该重写什么?
【问题讨论】:
我有一个想要变成集合的对象列表。我的对象包含一些字段,其中一些是o.id 和o.area。如果这两个字段相同,我希望两个对象相等。即:o1==o2 当且仅当o1.area==o2.area and o1.id==o2.id。
我尝试改写 __eq__ 和 __cmp__ 但我收到错误:TypeError: unhashable instance。
我应该重写什么?
【问题讨论】:
定义 __hash__ 方法以根据 id 和 area 字段返回有意义的哈希。例如:
def __hash__(self):
return hash(self.id) ^ hash(self.area)
【讨论】:
“类型错误:不可散列的实例。”错误可能是由于旧式类定义,即:
class A:
pass
改用新样式:
class A(object):
pass
如果您覆盖 __cmp__ 函数,您应该覆盖 __hash__ 以便在集合中使用您的对象。在另一种情况下,哈希将所有对象实例视为不相等,并且永远不会调用 __cmp__ 函数。
【讨论】: