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__删除对象属性

 

posted @ 2018-03-13 15:36  短毛兔  阅读(458)  评论(0编辑  收藏  举报