假设我有一本字典:
>>> d = {}
它有一个方法clear()
:
。。。具有__hash__
属性:
>>> d.clear.__hash__
<method-wrapper '__hash__' of builtin_function_or_method object at 0x7f2090456288>
。。。可调用:
>>> callable(d.clear.__hash__)
True
为什么我不能把它弄碎呢?在
>>> hash(d.clear)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
注意:我知道dict
对象是不可损坏的——我很好奇为什么这个限制会扩展到它们的方法,尽管如上所述,它们似乎声称不是这样的?在
马蒂恩是对的,因为他经常是对的。如果您有一个实现
dict
方法的dict
子类,那么即使是绑定的方法也可以是散列的输出:
^{pr2}$它是一个绑定方法,绑定方法引用
self
,例如字典。这使得该方法不可散列。在您可以散列未绑定的
dict.clear
方法:是散列的实例上的方法本身也是散列的,因此内置绑定方法的对象类型实现了一个}。这与
__hash__
方法,但在__self__
属性不可哈希时引发{object.__hash__
方法文档是一致的;如果您可以将其设置为None
或根本不实现它,那么这是更好的选择,但是对于只有在运行时才知道哈希性的情况下,引发一个TypeError
是唯一可用的选项。在相关问题 更多 >
编程相关推荐