Python进阶-----类的内置attr属性方法
针对类实例化的对象,才能触发内置属性:__getattr__ __delattr__ __setattr__
class Foo: x = 1 def __init__(self,y): self.y = y def __getattr__(self, item): #self为实例对象,item为调用的属性 # __getattr__只有在使用点调用属性且属性不存在的时候才会触发 print('触发__getattr__---->你要调取的属性【%s】不存在'%item) def __delattr__(self, item): #__delattr__删除属性的时候会触发 print('触发__delattr__---->删除了相关属性') def __setattr__(self, key, value): #__setattr__添加/修改属性会触发它的执行 print('触发__setattr__---->修改了相关属性') # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写, # 就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值 self.__dict__[key] = value f = Foo(2) #实例化相当于赋值操作,则触发__setattr__ f.z = 3 #增加z属性,则触发__setattr__ print(f.y) #2 f.yyyy #触发__getattr__---->你要调取的属性【yyy】不存在 del f.x #触发__delattr__---->删除了相关属性
attr方法的妙用和好处
class Foo: x = 1 def __init__(self,y,tag = False): self.y = y self.tag = tag def __getattr__(self, item): #self为实例对象,item为调用的属性 # __getattr__只有在使用点调用属性且属性不存在的时候才会触发 print('触发__getattr__---->你要调取的属性【%s】不存在'%item) def __delattr__(self, item): #__delattr__删除属性的时候会触发 if self.tag == True: #可用来判断用户是否有权限删除属性 print('已经删除属性【%s】'%item) self.__dict__.pop(item) else: print('无权限删除') def __setattr__(self, key, value): #__setattr__添加/修改属性会触发它的执行 if type(value) is str: #可用来判断用户设置的属性是否是指定的类型 print('已将【%s】属性设置为【%s】'%(key,value)) self.__dict__[key] = value else: print('设置的属性不合法!') f = Foo(2) # 1 可以用__getattr__来提示用户调用的属性不存在,而不是直接报错 print(f.z) #触发__getattr__---->你要调取的属性【z】不存在 # 2 可以用__delattr__来根据用户权限来是否执行删除操作,可以保护类的属性 f1 = Foo(3) del f1.y #因为f1实例没有传入tag权限属性值 ---> 无权限删除 print(f1.__dict__) #{'y': 3, 'tag': False} f2 = Foo(4,True) #传入了tag权限为True,所以可以执行删除操作 del f2.y #已经删除属性【y】 print(f2.__dict__) #{'tag': True} # 3 可以用__setattr__来规范用户传值类型 f3 = Foo('5') #已将【y】属性设置为【5】