Python 类的__setitem__(),__getitem()__,__delitem__()方法
参考:https://www.cnblogs.com/royfans/p/8191253.html
https://blog.51cto.com/unixman/1651922
__xxxitem__:使用 [''] 的方式操作属性时被调用
__setitem__:每当属性被赋值的时候都会调用该方法,因此不能再该方法内赋值 self.name = value 会死循环
__getitem__:一般如果想使用索引访问元素时,就可以在类中定义该方法 类似于使用 a['a']访问
__delitem__:当删除属性时调用该方法
类创建的对象如果想要使用 对象['']的方式操作时需要定义这几个方法
举例说明,创建一个简单的类在类的内部定义__setitem__(),__getitem()__,__delitem__()方法但是只在方法内支线print操作查看执行过程,不执行其他赋值或者删除操作
class_setitem_getitem_delitem.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # 定义一个类,定义方法__setitem__(),__getitem()__,__delitem__() # 方法只执行print操作,不实际执行赋值或者删除操作 class A( object ): def __setitem__( self ,key,value): print ( 'use __setitem__() set %s value %s' % (key,value)) def __getitem__( self ,key): print ( 'no key %s' % (key)) def __delitem__( self ,key): print ( 'del %s' % (key)) # 实例化 a = A() # 使用['']方式赋值,其实就是调用__setitem__()方法 a[ 'B' ] = 'BB' a.__setitem__( 'B' , 'BB' ) # use __setitem__() set B value BB # 使用['']调用元素,其实就是调用__getitem__()方法 a[ 'C' ] a.__getitem__( 'C' ) # no key C # # 使用['']删除元素,其实就是调用__delitem__()方法 del a[ 'D' ] a.__delitem__( 'D' ) # del D |
其中调用每一个方法都使用了两种写法,两种写法的作用是一致的,输出如下
1 2 3 4 5 6 | use __setitem__() set B value BB use __setitem__() set B value BB no key C no key C del D del D |
使用调试模式查看执行过程
执行a.__getitem__('C')和a['C']是一样的
再次执行一次a.__delitem__('D') 和执行del a['D']一样的
注意:__getitem__()方法并不是没有属性才调用的方法,而是使用['']方式才调用的方法
如果类内部不定义__setitem__()方法则使用a['B'] = 'BB'方式调用时报错
1 | AttributeError: __setitem__ |
如果不定义__getitem__()方法则使用a['C']调用时报错,定义__getitem__()方法可以使在没有对应属性时不报错,或者返回指定默认值
1 | TypeError: 'A' object is not subscriptable |
如果不定__delitem__()方法则使用del a['D']删除时报错
1 | AttributeError: __delitem__ |
以上演示了类在使用不同调用方式时分别用到__setitem__(),__getitem()__,__delitem__()方法,但是因为上述例子的对应方法只执行了print操作,并未实际操作一个对象,下面例子演示实际的赋值即删除操作。
类有一个字典属性__dict__该字典默认是一个空字典,下面写代码使用__setitem__(),__getitem()__,__delitem__()方法操作该字典
class_setitem_getitem_delitem2.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 操作类的字典__dict__ class A( object ): # 使用[key]=value方式赋值调用,相当于给字典添加一对key value def __setitem__( self , key,value): self .__dict__[key] = value # 使用[key]方式取元素调用 def __getitem__( self ,key): return self .__dict__[key] # 使用[key]方式调用,删除一个key value def __delitem__( self ,key): del self .__dict__[key] # 实例化对象赋值给a a = A() # 添加一个元素,相当于调用方法__setitem__() a[ 'B' ] = 'BB' # 添加完元素打印字典 print (a.__dict__) # {'B': 'BB'} # 使用[key]方式取元素,相当于调用__getitem__() print (a[ 'B' ]) # BB # 删除,相当于调用__delitem__() del a[ 'B' ] # 只有一个元素删除完即空了 print (a.__dict__) # {} |
本次操作的是类的属性__dict__该属性是一个字典,定义了__setitem__(),__getitem()__,__delitem__()方法就可以使用[key]方式进行添加,取得,删除元素操作
也可以不使用属性__dict__而是定义初始化方法__init__()在该方法内创建一个dict进行操作
1 2 | def __init__( self ): self .item = {} |
对应的3中方法
1 2 3 4 5 6 7 8 | def __setitem__( self ,key,value): self .item[key] = value def __getitem__( self ,key): return self .item.get(key) def __delitem__( self ,key): del self .item[key] |
注意:__getitem__()方法取元素最后使用get方法,因为使用[key]方法去取得一个字典的元素如果为空会报错,使用get方法如果为空则返回None
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!