一文搞懂__len__,__getitem__,__setitem__,__delitem__

本文深入讲解Python中__len__,__getitem__,__setitem__,__delitem__等特殊方法的使用,通过实例演示如何在自定义类中实现序列和映射协议,使对象能像内置序列和映射类型一样工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一文搞懂__len____getitem____setitem____delitem__

基本的序列和映射协议

序列和映射基本上是元素(item)的集合,要实现它们的基本行为(协议),不可变对象需要实现2个方法,而可变对象需要实现4个。

__len__(self):这个方法应返回集合包含的项数,对序列来说为元素个数,对映射来说为键-值对数。如果__len__返回零(且没有实现覆盖这种行为的__nonzero__),对象在布尔上下文中将被视为假(就像空的列表、元组、字符串和字典一样)。

__getitem__(self, key):这个方法应返回与指定键相关联的值。对序列来说,键应该是0~n-1的整数(也可以是负数),其中n为序列的长度。对映射来说,键可以是任何类型。

__setitem__(self, key,value):这个方法应以与键相关联的方式存储值,以便以后能够使用__getitem__来获取。当然,仅当对象可变时才需要实现这个方法

__delitem__(self, key):这个方法在对对象的组成部分使用__del__语句时被调用,应删除与key相关联的值。同样,**仅当对象可变(且允许其项被删除)**时,才需要实现这个方法

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.info = {name: age}

    def __getitem__(self, item):
        return self.info[item]

    def __setitem__(self, key, value):
        self.info[key] = value

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

    def __delitem__(self, key):
        del self.info[key]

# 实例化对象
s = Student('zhangsan', 18)
# 这个打印意思是当碰上这种形式自动去寻找__getitem__方法,并将参数传入返回结果
print(s['zhangsan'])  # 18
# 当碰上这种写法,那么会自动去寻找__setitem__方法,并设置
s['lisi'] = 19
# 此时打印结果已经增加了我们设置的数据
print(s.info)  # {'zhangsan': 18, 'lisi': 19}
# 当碰上这种写法,那么会自动去寻找__len__方法,并返回结果
print(len(s))  # 2
# 当碰上这种写法,那么会自动去寻找__delitem__方法
del s['lisi']
# 此时打印结果数据已经删除了
print(len(s))  # 1

语言是平白的,但是没有语言也很难理解,所以代码里面我已经做了分析,以及实现的原理,希望能够多看几遍,其实不难。还有一点我还要重点强调一遍不可变对象可以实现2个方法,而可变对象可以实现4个。

好了,今天就到这里吧,希望对大家都有所帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值