我有一个对象列表,我想把它变成一个集合.我的对象包含一些字段,其中一些是o.id
和o.area
.如果这两个字段相同,我希望两个对象相等.即:o1==o2
当且仅当o1.area==o2.area and o1.id==o2.id
.
我尝试过度写作__eq__
,__cmp__
但我得到了错误:TypeError: unhashable instance
.
我该怎么写?
Mar*_*tos 38
定义__hash__
方法以基于id和area字段返回有意义的哈希.例如:
def __hash__(self):
return hash(self.id) ^ hash(self.area)
Run Code Online (Sandbox Code Playgroud)
"TypeError:不可用的实例." 错误可能是由于旧式的类定义,即:
class A:
pass
Run Code Online (Sandbox Code Playgroud)
改为使用新风格:
class A(object):
pass
Run Code Online (Sandbox Code Playgroud)
如果覆盖__cmp__函数,则应覆盖__hash__以便在集合中使用对象.在另一种情况下,散列将所有对象实例视为不等,并且永远不会调用__cmp__函数.