双下划线开头的attr方法

 1 class Job:
 2     def __init__(self, name):
 3         self.name = name
 4 
 5     def __getattr__(self, item):  # 当调用的属性不存在的时候,就会触发此方法
 6         print('没有此属性')
 7 
 8     def __delattr__(self, item):  # 当删除属性时,会触发此方法
 9         print('删除方法__delattr__')
10 
11     def __setattr__(self, key, value):  # 只要有属性创建的时候就会触发此函数
12         print('__setattr__执行')
13         # self.key = value  # 出现递归
14         self.__dict__[key] = value
15 
16 
17 j1 = Job('小白')
18 print(j1.__dict__)
19 print(j1.name)
20 print(j1.sd)
21 j1.z = 2
22 print(j1.__dict__)
23 print(j1.name)
24 输出:
25 __setattr__执行
26 {'name': '小白'}
27 小白
28 没有此属性
29 None
30 __setattr__执行
31 {'name': '小白', 'z': 2}
32 小白
 1 class Job:
 2     def __init__(self, name):
 3         self.name = name
 4 
 5     def __getattr__(self, item):  # 当调用的属性不存在的时候,就会触发此方法
 6         print('没有此属性')
 7 
 8     def __delattr__(self, item):  # 当删除属性时,会触发此方法
 9         print('删除方法__delattr__')
10         self.__dict__.pop(item)
11 
12     def __setattr__(self, key, value):  # 只要有属性创建的时候就会触发此函数
13         print('__setattr__执行')
14         # self.key = value  # 出现递归
15         self.__dict__[key] = value
16 
17 
18 j1 = Job('小白')
19 del j1.name
20 print(j1.__dict__)
21 print(j1.__dict__)
22 print(j1.name)
23 print(j1.sd)
24 j1.z = 2
25 print(j1.__dict__)
26 print(j1.name)
27 输出:
28 __setattr__执行
29 删除方法__delattr__
30 {}
31 {}
32 没有此属性
33 None
34 没有此属性
35 None
36 __setattr__执行
37 {'z': 2}
38 没有此属性
39 None
原文地址:https://www.cnblogs.com/ch2020/p/12435941.html