我有一个类,它是tuple
的子类。我想将该类的实例用作set
的元素,但我得到的错误是它是一种不可用的类型。我想这是因为我已经覆盖了__eq__
和__ne__
方法。我该怎么做才能恢复我的类型的可持续性?我正在使用Python 3.2。
答案 0 :(得分:3)
比较相等的对象应具有same hash value
因此,最好将哈希基于您用于比较相等性的属性
Adrien的例子会更好像这样
class test(tuple):
def __eq__(self,comp):
return self[0] == comp[0]
def __ne__(self,comp):
return self[0] != comp[0]
def __hash__(self):
return hash((self[0],))
只需利用包含我们关心的相等内容的元组的哈希值
答案 1 :(得分:2)
你需要将你的类型变为hashable,这意味着在你的类中实现派生自元组的__hash__()
成员函数。
例如:
class test(tuple):
def __eq__(self,comp):
return self[0] == comp[0]
def __ne__(self,comp):
return self[0] != comp[0]
def __hash__(self):
return hash(self[0])
这就是现在的样子:
>>> set([test([1,]),test([2,]),test([3,])])
{(1,), (2,), (3,)}
>>> hash(test([1,]))
1
注意:您应该完全阅读__hash__()
函数的文档,以便了解比较运算符和哈希计算之间的关系。