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

猜你喜欢

转载自blog.csdn.net/HayPinF/article/details/107752668
今日推荐