代码改变世界

面向对象之类的内置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