一、前言
#在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']) #清华
四、删除对象属性
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'