潇湘慕风 发表于 2022-4-20 13:25:49

新人小白问一个魔法方法的小知识点

class Rectangle:
    def __init__(self, width=0, height=0):
      self.width = width
      self.height = height

    def __setattr__(self, name, value):
      if name == 'square':
            self.width = value   # 当运行到这里的时候,是否调用__setattr__()方法
            self.height = value
      else:
            self.__dict__ = value

    def getArea(self):
      return self.width * self.height

r1 = Rectangle()
r1.square = '10'
print(r1.width)

大家好,按照我的理解,在r.square = '10'的时候,调用setattr魔法方法,然后self.width = value又在调用settattr了,应该触发无限递归才是,但是实际上这段代码是正确的,请问这是为什么呀?

isdkz 发表于 2022-4-20 15:28:51

在r.square = '10'的时候,__setattr__ 中的 name 为 'square',执行 if 分支,

if 分支里面执行 self.width = value 和 self.height = value,此时 name 为 'width' 和 'height',不满足 name == 'square'

所以再次执行 __setattr__ 是执行了 else 分支,

else 分支里面用的是 self.__dict__ = value,所以不会触发 __setattr__,也就是说最多就发生一次递归

潇湘慕风 发表于 2022-4-20 17:48:59

isdkz 发表于 2022-4-20 15:28
在r.square = '10'的时候,__setattr__ 中的 name 为 'square',执行 if 分支,

if 分支里面执行 self.w ...

感谢大佬,懂了。
页: [1]
查看完整版本: 新人小白问一个魔法方法的小知识点