python 修改魔法方法常遇到的问题__setattr__

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)

猜你喜欢

转载自blog.csdn.net/qq_28724561/article/details/80452243