寄安 发表于 2021-8-24 15:56:29

魔方课后题

class Counter:
      def __init__(self):
                self.counter = 0 # 这里会触发 __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)



这里在初始化的方法里,self.counter触发setattr操作,那么这里触发的是系统的赋值,也就是self.counter被赋值为0,还是已经重写的setattr方法

如果是第一种情况,那么接下来 self.counter += 1,但是小甲鱼说“这时候 self.counter 还没有定义,所以没法 += 1”,这就说不通了呀

第二种情况,直接触发重写的setattr,那么出错也就理所应当了

wp231957 发表于 2021-8-24 16:02:40

class Counter:
      def __init__(self):
                print(1)
                self.counter = 0
                print(2)
      def __setattr__(self, name, value):
                print(3)
                self.counter += 1
                super().__setattr__(name, value)
      def __delattr__(self, name):
                self.counter -= 1
                super().__delattr__(name)
c=Counter()

加两条print语句 就清晰了

寄安 发表于 2021-8-24 16:21:15

wp231957 发表于 2021-8-24 16:02
class Counter:
      def __init__(self):
                print(1)


可以,这下问题就清晰多了
页: [1]
查看完整版本: 魔方课后题