码迷,mamicode.com
首页 > 其他好文 > 详细

类的特殊方法"__hash__"详解

时间:2018-08-02 22:42:33      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:方法   删除   turn   name   ict   不同的   定义   highlight   计算   

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__"详解

标签:方法   删除   turn   name   ict   不同的   定义   highlight   计算   

原文地址:https://www.cnblogs.com/594504110python/p/9409875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!