__getitem__,__setitem__,__delitem__

__getitem__、__setitem__、__delitem__

总结:

__getitem__,__setitem_,__delitem__  :  obj[‘属性’]的方式去操作属性时触发的方法
__getitem__:obj['属性'] 时触发
__setitem__:obj['属性']=属性的值 时触发
__delitem__:del obj['属性'] 时触发

赋值的底层原理都一样

f1.name = 'zhaok' #做的就是往属性字典里添加或覆盖值,原理:--->setattr----->f1.__dict__['name'] = 'egon'
f1['name'] = 'zhaok' --->setitem----->f1.__dict__['name'] = 'egon'
两个方法的底层都是一样的,只不过通过setattr,setitem中转了一下

 


 

区别:

__getattr__,__setattr__,__delattr__
obj点的方式去操作属性时触发的方法
__getitem__,__setitem_,__delitem__
obj[‘属性’]的方式去操作属性时触发的方法


__getattr__:obj.属性 不存在时触发
__setattr__:obj.属性=属性的值 时触发
__delattr__:del obj.属性 时触发

__getitem__:obj['属性'] 时触发
__setitem__:obj['属性']=属性的值 时触发
__delitem__:del obj['属性'] 时触发


 

复制代码
class Foo:
    def __init__(self,name):
        self.name = name
    def __getitem__(self, item):
        print('__getitem__执行,%s'%item)

    def __setitem__(self, key, value):
        print('__setitem__执行')
        self.__dict__[key] = value      #执行添加对象的属性字典

    def __delitem__(self, key):
        print('__delitem__执行')
        self.__dict__.pop(key)          #删除对象

f1['aaa']='999'

f1 = Foo('aa')  #实例化对象
f1['age']       #通过字典的方式查询,会触发__getitem__的运行
f1.aaa
f1.name = 'zhaok'   #添加实例属性,以.的方式去设置属性,并不会触发__setitem__的执行
f1.age = 18
f1.sex = ''
f1['sex'] = ''     #以字典的方式去访问,会触发item的执行,以点的方式访问会执行attr类型的函数
print(f1.__dict__)
复制代码

 

posted @   总要做些什么  阅读(313)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示