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