|  | 
 
 发表于 2023-8-9 22:16:05
|
显示全部楼层 
| class Counter: def __init__(self):
 self.count = 0
 
 def __setattr__(self, name, value):
 if name != 'count':
 self.count += 1
 return super().__setattr__(name, value)
 
 def __delattr__(self, name):
 self.count -= 1
 
 class Counter:
 def __init__(self):
 self.count = 0
 def __setattr__(self,name,value):
 self.count += 1
 return super().__setattr__(name,value)
 def __delattr__(self,name):
 self.count -= 1
 ----------------------------------------------------------------------------------------------------------------
 先说第一段 代码:  假设不增加新的 attr ,  那么 if name != 'count' 就永远不执行.  发挥拦截作用的是 最后一句 return super().__setattr__(name, value).
 第二段代码:   init 初始化失败!  代码在init 赋值时 会调用 __setattr__方法 . self.name+=1 这句无法执行(原因是:self.name=self.name+1,  注意 self.name+1 是在右边的,是个<右值>,self没有初始化成功,何来的slef.name+1?)
 总结:  self.name+=1 这个代码 只有在初始化 成功之后 才可以用.  第一段 代码 初始化成功(依赖super的setattr) 存在self.name; 假设给个新属性 p.age=20, self.name+1 成功执行.
 
 | 
 |