python笔记 __eq__和__len__

96 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)

image.png

2 __len__的使用

经常看到len(列表),得到列表的长度,它是怎么实现的呢,查询help列表,这里有个__len__,返回了len(self)。

image.png

演示如下和结果如下:

试一下列表.__len__方法,最终结果是一样的。

a = [11, 22, 33]
print(len(a))
print(a.__len__())

image.png

object里没有找到__len__,说明没有实现这个方法,类里面需要使用,需要手动加上__len__。

image.png

手动添加如下代码:

当然这里a的值,是接收一个列表用的,单纯一个变量传入会报错的。只是为了测试用的,别较真。

class demo:
    def __init__(self, a):
        self.a = a

    def __len__(self):
        return len(self.a)


print(len(demo([1, 2, 3])))

image.png

3 总结

__hash____eq__让类具备的可比性。而__len__经常使用,比如在判断或得到一个列表的长度,但是我们很少用在类中,一个原来它是不支持,另一个原因可能是也用不到几次吧,若就想得到它的长度,加入__len__即可。