【发布时间】:2015-02-11 04:46:57
【问题描述】:
我想编写一个可以用作可散列集合中的键的类(例如在dict 中)。我知道默认情况下用户类是可散列的,但在这里使用 id(self) 是错误的。
我的班级持有一个tuple 作为成员变量。从tuple 派生似乎不是一个选项,因为在我的构造函数中,我没有得到与tuple 构造函数相同类型的参数。但也许这不是限制?
我需要的基本上是 tuple 的哈希值,就像一个真正的元组给出的那样。
hash(self.member_tuple) 就是这样做的。
这里的想法是两个元组可以相等,但 id 不相等。
如果我按如下方式实现我的__cmp__():
def __cmp__(self, other):
return cmp(self, other)
这会自动诉诸hash(self) 进行比较吗? ...或者我应该按如下方式实现它:
def __cmp__(self, other):
return cmp(self.member_tuple, other)
我的__hash__()函数被实现为返回持有的tuple的哈希值,即:
def __hash__(self):
return hash(self.member_tuple)
基本上,__cmp__() 和 __hash__() 是如何交互的?我不知道__cmp__() 中的other 是否已经是一个散列,以及我是否应该与“我的”散列(这将是持有的tuple 之一)或self 进行比较。
那么哪一个是正确的呢?
任何人都可以对此有所了解并可能指出我的文档吗?
【问题讨论】:
标签: python dictionary hash collections python-2.x