ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python 类的__setitem__(),__getitem()__,__delitem__()方法

2021-08-12 09:02:04  阅读:264  来源: 互联网

标签:__ key Python self setitem delitem getitem


  参考: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

     

 

标签:__,key,Python,self,setitem,delitem,getitem
来源: https://www.cnblogs.com/minseo/p/15131083.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有