• __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__)
  • 相关阅读:
    BZOJ 1192 鬼谷子的钱袋
    BZOJ 1012 最大数maxnumber
    BZOJ 3209 花神的数论题
    线段树讲解(数据结构、C++)
    BZOJ 1087 互不侵犯king
    BZOJ 2732: [HNOI2012]射箭
    BZOJ 1043: [HAOI2008]下落的圆盘
    BZOJ 4451: [Cerc2015]Frightful Formula
    BZOJ 2888: 资源运输
    BZOJ 4800: [Ceoi2015]Ice Hockey World Championship
  • 原文地址:https://www.cnblogs.com/shangpolu/p/6232651.html
Copyright © 2020-2023  润新知