持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 使用__eq__
和之前的__hash__的例子串起来,虽然hash相同了,但是实例不相等,这个时候就需要__eq__出场了,因为解释器一般会同时去判断实例和hash是否相等,所以一般__hash__和__eq__要同时使用。代码如下:
运行下面的代码,最终的结果如下图:确实相等了。但是hash是个负数,是对的嘛?没关系的,是整数就行,无所谓负数不负数的。但是有位数的限制。
class Demo1:
def __init__(self, a):
self.a = a
def __hash__(self):
return hash(f'{self.a}')
def __eq__(self, o):
return self.a == o.a
print(hash(Demo1(1)))
print(hash(Demo1(1)))
d = Demo1(1)
d1 = Demo1(1)
print(d == d1)
2 __len__的使用
经常看到len(列表),得到列表的长度,它是怎么实现的呢,查询help列表,这里有个__len__,返回了len(self)。
演示如下和结果如下:
试一下列表.__len__方法,最终结果是一样的。
a = [11, 22, 33]
print(len(a))
print(a.__len__())
object里没有找到__len__,说明没有实现这个方法,类里面需要使用,需要手动加上__len__。
手动添加如下代码:
当然这里a的值,是接收一个列表用的,单纯一个变量传入会报错的。只是为了测试用的,别较真。
class demo:
def __init__(self, a):
self.a = a
def __len__(self):
return len(self.a)
print(len(demo([1, 2, 3])))
3 总结
__hash__和__eq__让类具备的可比性。而__len__经常使用,比如在判断或得到一个列表的长度,但是我们很少用在类中,一个原来它是不支持,另一个原因可能是也用不到几次吧,若就想得到它的长度,加入__len__即可。