哈希Python类是一个好主意吗?

Jas*_*ker 5 python hash inheritance dictionary class

例如,假设我这样做:

>>> class foo(object):
...     pass
... 
>>> class bar(foo):
...     pass
... 
>>> some_dict = { foo : 'foo',
... bar : 'bar'}
>>> 
>>> some_dict[bar]
'bar'
>>> some_dict[foo]
'foo'
>>> hash(bar)
165007700
>>> id(bar)
165007700
Run Code Online (Sandbox Code Playgroud)

基于此,看起来该类正在作为其id号进行哈希处理.因此,如果我改变了类,那么不应该担心bar散列是否为a foo或a bar或散列值.

这种行为是否可靠,或者这里有任何问题吗?

And*_*ton 8

是的,任何未实现__hash__()函数的对象都将在哈希时返回其id.从Python语言参考:数据模型 - 基本定制:

用户定义的类默认具有__cmp__()__hash__()方法; 与它们一起,所有对象都比较不等(除了自己)和x.__hash__()返回id(x).

但是,如果您希望拥有唯一标识符,请使用id以明确您的意图.对象的哈希应该是其组件的哈希的组合.有关详细信息,请参阅上面的链接.

  • 任何*metaclass*没有__hash __()函数的类. (2认同)

Rob*_*ern 6

类有默认的实现__eq__,并__hash__在使用id()作出了比较,并分别计算哈希值.也就是说,他们按身份进行比较.实现__hash__方法的主要规则是,如果两个对象相互比较相等,则它们也必须具有相同的哈希值.散列值可以看作是dicts和sets使用的优化,可以更快地找到相等的对象.因此,如果您更改__eq__为执行不同类型的相等性测试,则还必须更改__hash__实现以同意该选择.

使用身份进行比较的类可以自由地变异并在dicts和sets中使用,因为它们的身份永远不会改变.实现__eq__按值进行比较并允许其值变异的类不能在散列集合中使用.