类的特殊方法"__hash__"详解
Posted 594504110python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的特殊方法"__hash__"详解相关的知识,希望对你有一定的参考价值。
2018-08-02
# __hash__
# 当一个对象的类中有"__hash__"这个方法时, 那么这个对象就可以执哈希计算
# 前提是要哈希的值是可哈希的. 哈希的不是对象, 而是可以通过对象直接执行"hash(obj)"
定义一个支持hash的类
class A: def __init__(self): self.name = ‘sath‘ def __hash__(self): # 有"__hash__"方法的类产生的对象, 既可以执行hash功能 return hash(self.name) obj = A() print(hash(obj)) # 结果: 4163081807956676427
哈希的过程
# 将值通过哈希算法, 生成一个应该是唯一的整数, 为什么说应该是唯一的, 因为哈希生成的数字是有限的, # 而可哈希的就太多了, 所以表示不过来, 有可能出现两个不同的值计算的哈希值是相同的,那怎么办 # 当在哈希的过程中遇到两个哈希值相同时, 会进一步调用对象类中的"__eq__"方法判断具体的值是否相等 # 如果相等, 则直接丢弃或覆盖(待确定), 如果具体的值不相同, 后计算的那个值会再次计算哈希值, 从新来一次
哈希的结果
# 同一次运行, 相同的值, 计算出的哈希值是相同的 # 不是同一次运行, 相同的值, 计算出的哈希值也不一样
哈希的优点体现
# 字典的效率比较高, 原因就在于使用了key + hash算法, 一次就能把值取出来 # 前面说了, 哈希值相同的不会存储, 这也是dict的key为什么不能重复的原因, 当一个字典中存在相同的key是, 经过hash后, 就会删除掉重复的 # set集合也是如此
以上是关于类的特殊方法"__hash__"详解的主要内容,如果未能解决你的问题,请参考以下文章
Python面向对象编程第13篇 特殊方法之__hash__