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

本文探讨了Python中魔法方法__setattr__的问题,分析了在初始化过程中使用该方法导致self.counter未定义的错误,并提供了两种解决方案:一是通过super()调用来避免递归错误;二是先通过super().__setattr__初始化counter,再进行计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值