新人小白问一个魔法方法的小知识点
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了,应该触发无限递归才是,但是实际上这段代码是正确的,请问这是为什么呀? 在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__,也就是说最多就发生一次递归 isdkz 发表于 2022-4-20 15:28
在r.square = '10'的时候,__setattr__ 中的 name 为 'square',执行 if 分支,
if 分支里面执行 self.w ...
感谢大佬,懂了。
页:
[1]