class Counter:
def __init__(self):
self.counter = 0
def __setattr__(self, name, value):
self.counter += 1
super().__setattr__(name, value)
def __delattr__(self, name):
self.counter -= 1
super().__delattr__(name)
这段代码有问题吗?
初学者学习魔法方法的时候很容易遇到一个问题 瞻前顾后
class Counter:
def __init__(self):
self.counter = 0 # 这里会触发 __setattr__ 调用#只要赋值就会直接跳到__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)
那么如何修改呢???????????
我们这里
>>> class Counter:
def __init__(self):
self.counter = 0
def __setattr__(self, name, value):
super().__setattr__(name, value + 1)#只需要转个弯即可...
def __delattr__(self, name):
self.counter -= 1
super().__delattr__(name)
>>> c =Counter()
>>> c.count
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
c.count
AttributeError: 'Counter' object has no attribute 'count'
>>> c.counter
1
另外一个比较好的办法
#改动
class Counter:
def __init__(self):
super().__setattr__('counter', 0)
def __setattr__(self, name, value):
super().__setattr__('counter', self.counter + 1)#将子类的该方法设置为计数的
super().__setattr__(name, value)#这句不懂吗 其实就是设计新属性的意思 从基类调用这个方法 因为子类的该方法已经修改为计数的了
def __delattr__(self, name):
super().__setattr__('counter', self.counter - 1)
super().__delattr__(name)