• 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__删除对象属性
  • 相关阅读:
    SQL SERVER 慢查询检查语句
    Bootstrap Table表头多一行
    继承方法给页面加上Session判断的小例子
    TreeView隐藏指定节点的CheckBox
    再次解决 尝试加载 Oracle 客户端库时引发 BadImageFormatException
    ASP.NET的路由系统:根据路由规则生成URL【转】
    ASP.NET的路由系统:路由映射 【转】
    ASP.NET的路由系统:URL与物理文件的分离【转】
    pycham中使用mysqldb(python2.7)
    Pyhton配置CGI
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8557277.html
Copyright © 2020-2023  润新知