面向对象之类的内置attr属性、item属性
2019-11-20 22:55 风e逸 阅读(223) 评论(0) 收藏 举报类的内置attr属性:__getattr__, __setattr__, __delattr__
__getattr__: 在对象查找类的属性不存在时触发
__setattr__: 在设置类的属性时触发
__delattr__:在删除类的属性时触发
1 class People: 2 aaa = 1 3 bbb = 2 4 def __init__(self, abc): 5 self.abc = abc 6 def __getattr__(self, item): 7 print("%s 不存在" % item) 8 def __delattr__(self, item): 9 print('删除') 10 def __setattr__(self, key, value): 11 print('设置\修改值') 12 13 p1 = People(111) 14 # print(p1.aaa) 15 # p_g = hasattr(p1,'aaa') 16 # print(p_g) 17 18 p1.bac # bac # 输出结果:不存在 在默认__getattr__时,会报错 19 del p1.aaa # 输出结果:删除 20 p1.bbb = 3 # 输出结果:设置\修改值
在三个attr内置属性中,一般__delattr__和__setattr__默认使用,使用较多的是__getattr__,用来防止程序报错中断
在使用__delattr__和__setattr__中,需要通过调用字典属性设置,不能直接用self.k = v ,否则会陷入递归。
除以上三种外,还有一个内置属性__getattribute__
与上面方法不同的是,__getattribute__在设置后,不论调用是否存在,都会触发此函数。
item与attr不同之处在于,item在通过字典访问时触发。
1 class Foo: 2 3 def __getitem__(self, item): 4 print('getitem', item) 5 return self.__dict__[item] 6 7 def __setitem__(self, key, value): 8 print('setitem') 9 self.__dict__[key] = value 10 11 def __delitem__(self, key): 12 print('delitem') 13 self.__dict__.pop(key) 14 15 16 f1 = Foo() 17 f1