• 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

    # 定义一个类,定义方法__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
    

      其中调用每一个方法都使用了两种写法,两种写法的作用是一致的,输出如下

    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'方式调用时报错

    AttributeError: __setitem__
    

      如果不定义__getitem__()方法则使用a['C']调用时报错,定义__getitem__()方法可以使在没有对应属性时不报错,或者返回指定默认值

    TypeError: 'A' object is not subscriptable
    

      如果不定__delitem__()方法则使用del a['D']删除时报错

    AttributeError: __delitem__
    

      以上演示了类在使用不同调用方式时分别用到__setitem__(),__getitem()__,__delitem__()方法,但是因为上述例子的对应方法只执行了print操作,并未实际操作一个对象,下面例子演示实际的赋值即删除操作。

      类有一个字典属性__dict__该字典默认是一个空字典,下面写代码使用__setitem__(),__getitem()__,__delitem__()方法操作该字典

      class_setitem_getitem_delitem2.py

    # 操作类的字典__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进行操作

    def __init__(self):
        self.item = {}
    

      对应的3中方法

    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

         

  • 相关阅读:
    BZOJ-1206 虚拟内存 Hash+离散化+Priority_Queue
    BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理
    BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞
    学习笔记 --- 最小费用最大流
    BZOJ-1927 星际竞速 最小费用最大流+拆点+不坑建图
    BZOJ-1070 修车 最小费用最大流+拆点+略坑建图
    BZOJ-1207 打鼹鼠 DP(LIS)
    BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论
    BZOJ-1189 紧急疏散evacuate BFS预处理+最大流+二分判定+神建模!!
    BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图
  • 原文地址:https://www.cnblogs.com/minseo/p/15131083.html
Copyright © 2020-2023  润新知