2

我有一个类,它是tuple. 我想将该类的实例用作 a 的元素set,但我得到它是不可散列类型的错误。我想这是因为我已经覆盖了__eq__and__ne__方法。我应该怎么做才能恢复我的类型的哈希性?我正在使用 Python 3.2。

4

2 回答 2

3

比较相等的对象应该具有相同的哈希值

因此,将哈希基于您用来比较相等性的属性是一个好主意

阿德里安的例子会更好这样

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],))

简单地利用包含我们关心的东西的元组的哈希值来实现平等

于 2012-10-06T10:47:03.297 回答
2

您需要将您的类型设为可散列,这意味着__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__()函数的文档,以了解比较运算符和哈希计算之间的关系。

于 2012-10-06T09:48:03.617 回答