散列Python类是个好主意吗?

散列Python类是个好主意吗?,python,class,inheritance,hash,dictionary,Python,Class,Inheritance,Hash,Dictionary,例如,假设我这样做: >>> class foo(object): ... pass ... >>> class bar(foo): ... pass ... >>> some_dict = { foo : 'foo', ... bar : 'bar'} >>> >>> some_dict[bar] 'bar' >>> some_dict[foo] 'foo' >

例如,假设我这样做:

>>> 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
基于此,该类看起来像是被散列为其id号。因此,如果我对类进行变异,就不应该担心
bar
散列作为
foo
bar
或散列值的变化


此行为可靠吗,或者是否存在任何漏洞?

是的,任何未实现
\uuuuuuuhash\uuuuu()函数的对象在散列时都将返回其id。发件人:

默认情况下,用户定义的类具有
\uuu cmp\uu()
\uu hash\uuu()
方法;使用它们,所有对象都比较不相等(除了它们自己)和
x.\uuuu hash\uuuu()
返回
id(x)


但是,如果您希望有一个唯一的标识符,请使用
id
来明确您的意图。对象的散列应该是其组件的散列的组合。有关更多详细信息,请参见上面的链接。

类具有默认的
\uuuuuueq\uuuuuu
\uuuuuuuuhash\uuuuuu>实现,它们分别使用
id()
进行比较和计算哈希值。也就是说,他们通过身份进行比较。实现
\uuuuuuuuuuuuuuuuuu散列
方法的主要规则是,如果两个对象的比较相等,则它们也必须具有相同的散列值。散列值可以看作是dict和set用来更快地找到相等对象的优化。因此,如果您更改
\uuuuuu eq\uuuu
以执行不同类型的相等性测试,则还必须更改
\uuuuuuu hash\uuuuu
实现以同意该选择


使用标识进行比较的类可以自由地进行变异,并在dict和set中使用,因为它们的标识永远不会改变。实现
\uuuuu eq\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>以按值进行比较并允许值变异的类不能用于哈希集合。

其元类没有uuuuuuuuuuuuuuu,在python 2.4下,这种行为似乎对我有效。@Jason我更改了对常规文档的引用。工作人员补充了一件事:永远不要以这种方式保留使用id的词典。id是对象的内存地址,仅对当前进程有效。此答案已过时
x.\uu散列函数(hash)(
不再返回
id(x)