超级大的甲鱼 发表于 2020-7-15 12:00:07

45课课后题

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)
如果在__new__里定义count会不会出错呢?

永恒的蓝色梦想 发表于 2020-7-15 12:00:49

会。

超级大的甲鱼 发表于 2020-7-15 12:02:21

永恒的蓝色梦想 发表于 2020-7-15 12:00
会。

那就是说在__setattr__里不能进行运算操作了吗?还是说有其他的方法呢

永恒的蓝色梦想 发表于 2020-7-15 12:06:21

超级大的甲鱼 发表于 2020-7-15 12:02
那就是说在__setattr__里不能进行运算操作了吗?还是说有其他的方法呢

class Counter:
      def __init__(self):
                super().__setattr__("counter", 0) # 这里不会触发 __setattr__ 调用
      def __setattr__(self, name, value):
                self.counter += 1
                super().__setattr__(name, value)
      def __delattr__(self, name):
                self.counter -= 1
                super().__delattr__(name)

超级大的甲鱼 发表于 2020-7-15 12:10:20

永恒的蓝色梦想 发表于 2020-7-15 12:06


腻害

超级大的甲鱼 发表于 2020-7-15 12:49:42

永恒的蓝色梦想 发表于 2020-7-15 12:06


但是这个会出无限递归吧,在__setattr__里面直接self.counter += 1

永恒的蓝色梦想 发表于 2020-7-15 13:40:02

超级大的甲鱼 发表于 2020-7-15 12:49
但是这个会出无限递归吧,在__setattr__里面直接self.counter += 1

super() 之后调用的是 object 的 __setattr__ 啦

超级大的甲鱼 发表于 2020-7-15 14:12:11

永恒的蓝色梦想 发表于 2020-7-15 13:40
super() 之后调用的是 object 的 __setattr__ 啦

def __setattr__(self, name, value):
                self.counter += 1
这里对counter进行修改不就无限递归了吗,每进行一次self。counter+= 1 都会再次调用Counter.__setattr__()

永恒的蓝色梦想 发表于 2020-7-15 14:19:06

超级大的甲鱼 发表于 2020-7-15 14:12
def __setattr__(self, name, value):
                self.counter += 1
这里对counter进行修改不就 ...

你说的是这个啊,确实会无限递归。当时没发现{:10_277:}

改成:class Counter:
    def __init__(self):
      super().__setattr__("counter", 0) # 这里不会触发 __setattr__ 调用
    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)
页: [1]
查看完整版本: 45课课后题