1.  
  2. 主页
  3.  / 
  4. Python基础到高级
  5.  / 
  6. 魔术方法
  7.  / 
  8. hash

hash

hash

在python3中,所有的类都是默认继承object的,在object中有一个hash的魔术方法

In [20]: object.__hash__
Out[20]: <slot wrapper '__hash__' of 'object' objects>

在使用内置的hash对某个对象求hash值的时候,会调用对象的__hash__方法

hash的返回值必须是int类型的数据

In [21]: class Point: 
    ...:     def __hash__(self):   # 类中的hash方法
    ...:         return 1 
    ...:     

In [22]: hash(Point())   # 当对一个对象做hash的时候,就是在调用对象的hash方法
Out[22]: 1

In [23]: class Point:
    ...:     def __hash__(self):
    ...:         return 'adc'    
    ...:     
    ...:     

In [24]: hash(Point())   # hash方法只能返回为整型,否则会抛出TypeError的错误
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-a919dcea3eae> in <module>()
----> 1 hash(Point())

TypeError: __hash__ method should return an integer

可hash对象,就是具有__hash__方法的对象

当可hash对象的返回值被重写修改为非int类型的时候,就是不可hash的对象了

一个类如果没有重写__hash__方法的话,这个类的每个对象,通常有不同的hash

通常__hash__会和__eq__一起使用,因为解释器通常同时判断hash是否相等,以及实例是否相等

当对象实现了__len__方法的时候,可以使用内置方法len求对象的长度,__len__方法必须返回非负整数

In [25]: class Sized:
    ...:     def __len__(self):   # 给类添加了len方法
    ...:         return 10
    ...:     

In [27]: len(Sized())   # 调用了类的len方法
Out[27]: 10

In [28]: lst = [1,2,3]

In [29]: lst.__len__()
Out[29]: 3
这篇文章对您有用吗?

我们要如何帮助您?

发表评论

您的电子邮箱地址不会被公开。