redaiconglin 发表于 2022-4-1 12:42:20

关于第45讲属性访问最后一题的疑问

>>> class Counter:
      k = []
      def __init__(self):
                self.counter = 0
      def __setattr__(self, name, value):
                if name != 'counter':
                        if name not in self.k:
                              self.counter += 1               这段在触发setattr时没有造成死循环是因为有上面的if条件语句吗。
                              self.k.append(name)
                super().__setattr__(name, value)
      def __delattr__(self, name):
                self.counter -= 1
                self.k.remove(name)
                super().__delattr__(name)
谢谢老师能解答我的疑惑。谢谢

isdkz 发表于 2022-4-1 13:21:45

对的,当 name 不等于 counter 的时候才会执行 if 语句的内容,

而 if 语句里会触发 __setattr__ 的只有 self.counter += 1,

这时 name 等于 counter,所以就不会继续执行 if 语句的内容,

而是往下执行了 super().__setattr__(name, value),

所以就不会造成无限递归

python爱好者. 发表于 2022-4-1 13:22:21

这是增量赋值,需要用增量赋值的魔法方法才会检测到

redaiconglin 发表于 2022-4-1 14:02:14

isdkz 发表于 2022-4-1 13:21
对的,当 name 不等于 counter 的时候才会执行 if 语句的内容,

而 if 语句里会触发 __setattr__ 的只有 ...

感谢老师的解答
页: [1]
查看完整版本: 关于第45讲属性访问最后一题的疑问