我有一个对象列表,我想把它变成一个集合。我的对象包含一些字段,其中一些字段为o.id
和o.area
。如果这两个字段相同,我希望两个对象相等。即:o1==o2
当且仅当o1.area==o2.area and o1.id==o2.id
。
我尝试覆盖__eq__
和__cmp__
,但收到错误:TypeError: unhashable instance
。
我应该写什么?
答案 0 :(得分:38)
定义__hash__
方法,根据id和area字段返回有意义的哈希值。 E.g:
def __hash__(self):
return hash(self.id) ^ hash(self.area)
答案 1 :(得分:9)
“TypeError:不可用的实例。”错误可能是由于旧式的类定义,即:
class A:
pass
改为使用新风格:
class A(object):
pass
如果覆盖__cmp__函数,应覆盖__hash__,以便在集合中使用对象。在另一种情况下,散列将所有对象实例视为不等,并且永远不会调用__cmp__函数。