类的特殊方法"__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__

Python面向对象编程第13篇 特殊方法之__hash__

python 问题 关于类的

[py]python str getattr特殊方法

Python类的成员

类的特殊成员方法