魔方课后题
class Counter:def __init__(self):
self.counter = 0 # 这里会触发 __setattr__ 调用
def __setattr__(self, name, value):
self.counter += 1
“““既然需要 __setattr__ 调用后才能真正设置 self.counter 的值,所以这时候 self.counter 还没有定义,所以没法 += 1,错误的根源。”””
super().__setattr__(name, value)
def __delattr__(self, name):
self.counter -= 1
super().__delattr__(name)
这里在初始化的方法里,self.counter触发setattr操作,那么这里触发的是系统的赋值,也就是self.counter被赋值为0,还是已经重写的setattr方法
如果是第一种情况,那么接下来 self.counter += 1,但是小甲鱼说“这时候 self.counter 还没有定义,所以没法 += 1”,这就说不通了呀
第二种情况,直接触发重写的setattr,那么出错也就理所应当了 class Counter:
def __init__(self):
print(1)
self.counter = 0
print(2)
def __setattr__(self, name, value):
print(3)
self.counter += 1
super().__setattr__(name, value)
def __delattr__(self, name):
self.counter -= 1
super().__delattr__(name)
c=Counter()
加两条print语句 就清晰了 wp231957 发表于 2021-8-24 16:02
class Counter:
def __init__(self):
print(1)
可以,这下问题就清晰多了
页:
[1]