• Python3 item系列


    一、前言

    #在python中一切皆对象
    '''
    创建了一个dict实例-->dic就是dict的实例对象
    我们通过dic['k1']可以得到k1所对应的值
    那么我们自定义一个类,可不可以使用对象[变量名]的方式得到我们想要得到的值呢?
    '''
    dic = dict({'k1':'v1','k2':'v2'})
    
    print(dic['k1'])

    我们创建一个字典对象并赋初始值,我们可以通过字典对象[key]得到其dic[key]所对应的value。

    那么我们自定义一个类,能否通过对象[变量名]得到我们想要的值呢?

    class Person(object):
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
    
    zhangsan = Person('zhangsan',30)
    print(zhangsan['name'])  #TypeError Person object is not subsctiptable

    编译器报错了,Python内部提供了支持这种方式访问我们的对象属性的方式,是item系列

    二、__getitem__(self,item)

    class Person(object):
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def __getitem__(self, item):
            return self.__dict__[item]
    
    zhangsan = Person('zhangsan',30)
    print(zhangsan['name']) 

    obj[变量名]  实际上调用了内部的__getitem__(self,item)方法,我们可以通过实现这个方法,来实现想要的效果。

    self.__dict__返回的是字典类型的 对象所有的属性

    我们通过__getitem__获取到了对象的属性值,响应的也会有对对象的属性进行赋值和修改值得操作:__setitem__()

    三、__setitem(self,key,value)

    class Person(object):
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def __getitem__(self, item):
            return self.__dict__[item]
    
        def __setitem__(self, key, value):
            self.__dict__[key] = value
    
        def getinfo(self):
            print(self.__dict__) #{'name': 'zhangsan', 'age': 30}
    
    
    zhangsan = Person('zhangsan',30)
    print(zhangsan['name'])
    zhangsan['age'] = 40     #将年龄修改为40
    print(zhangsan['age'])   #40

    此时的年龄被修改为40

    除了可以修改属性值的作用,__setitem__()还可以添加对象属性

    class Person(object):
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def __getitem__(self, item):
            return self.__dict__[item]
    
        def __setitem__(self, key, value):
            self.__dict__[key] = value
    
        def getinfo(self):
            print(self.__dict__) #{'name': 'zhangsan', 'age': 30}
    
    
    zhangsan = Person('zhangsan',30)
    print(zhangsan['name'])
    zhangsan['age'] = 40
    print(zhangsan['age'])
    zhangsan['school'] = '清华'
    print(zhangsan.school)  #清华
    print(zhangsan['school'])  #清华
    __setitem__添加对象属性

    四、删除对象属性

    class Person(object):
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def __getitem__(self, item):
            return self.__dict__[item]
    
        def __setitem__(self, key, value):
            self.__dict__[key] = value
    
        def getinfo(self):
            print(self.__dict__) #{'name': 'zhangsan', 'age': 30}
    
        def __delitem__(self, key):
            del self.__dict__[key]
    
    zhangsan = Person('zhangsan',30)
    print(zhangsan['name'])
    zhangsan['age'] = 40
    print(zhangsan['age'])
    zhangsan['school'] = '清华'
    print(zhangsan.school)  #清华
    print(zhangsan['school'])  #清华
    
    del zhangsan['school']
    print(zhangsan['school']) #KeyError : 'school'
    __delitem__删除对象属性
  • 相关阅读:
    2020-03-12推荐阅读链接
    一问带你区分清楚Authentication,Authorization以及Cookie、Session、Token
    Alibaba-技术专区-开源项目之Nacos源码分析
    Alibaba-技术专区-开源项目之Nacos功能特性
    Alibaba-技术专区-开源项目之Nacos环境准备
    Java-技术专区-javaAgent(插桩,attach)
    SkyWalking 6.x 源码分析 —— 调试环境搭建 (非原创)
    SkyWalking 6.2-Docker-Compose搭建单体
    Zookeeper-技术专区-配置以及学习
    Java-技术专区-设计模式-reactor模式
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8557277.html
Copyright © 2020-2023  润新知