Python:集合是如何工作的
我有一组对象,想把它们变成一个集合。我的这些对象里有几个字段,其中包括 o.id
和 o.area
。我希望如果这两个字段相同,那么这两个对象就算是相等的。也就是说,只有当 o1.area==o2.area
且 o1.id==o2.id
时,o1==o2
才成立。
我尝试重写了 __eq__
和 __cmp__
这两个方法,但出现了错误:TypeError: unhashable instance
。
我应该重写什么呢?
2 个回答
9
“TypeError: unhashable instance.” 这个错误通常是因为你使用了旧式的类定义,也就是:
class A:
pass
建议你使用新式的类定义:
class A(object):
pass
如果你重写了 __cmp__ 这个函数,那么你应该同时重写 __hash__ 函数,这样才能让你的对象在集合(sets)中使用。否则,哈希函数会认为所有对象实例都是不相等的,这样 __cmp__ 函数就不会被调用了。
38
定义一个 __hash__
方法,让它根据 id 和 area 字段返回一个有意义的哈希值。比如:
def __hash__(self):
return hash(self.id) ^ hash(self.area)