python中object基类的setattr(self, name, value, /)实例方法

Python魔法方法之属性访问 ( __getattr__, __getattribute__, __setattr__, __delattr__ )

class Test:
    def __init__(self):
        self.count = 0
    def __setattr__(self, name, value):
        print('__setattr__')
        self.count += 1
obj = Test()

python3.8执行输出:
haypin@ubt:~/Files$ python3.8 m08026.py
__setattr__
Traceback (most recent call last):
  File "m08026.py", line 7, in <module>
    obj = Test()
  File "m08026.py", line 3, in __init__
    self.count = 0
  File "m08026.py", line 6, in __setattr__
    self.count += 1
AttributeError: 'Test' object has no attribute 'count'
haypin@ubt:~/Files$

        python类如果重写了__setattr__(self, name, value)实例方法,则在任何执行实例属性赋值的语句时,都会默认调用__setattr__()方法。

为什么会出现上述情况呢?我还没有调用__setattr__()呢,只是单纯的定义了一个实例而已? @_@(咋回事?幻觉吗)

看报错信息很容易明白,这是因为:

① __init__()时,给内部属性 self.count进行了赋值;

② 赋值默认调用 __setattr__() 方法

③ 当调用 __setattr__()方法时,首先打印 '__setattr__'字符串,而后执行 self.cout += 1操作

④ 当执行 self.cout 加 1 操作时,将会去寻找 count 这个属性,然而,由于此时 __init__尚未完成,并不存在 count这个属性,因此导致 'AttributeError' 错误

        https://www.cnblogs.com/Jimmy1988/p/6804095.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值