|
发表于 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 成功执行.
|
|