鱼C论坛

 找回密码
 立即注册
查看: 4329|回复: 2

[已解决]新人小白问一个魔法方法的小知识点

[复制链接]
发表于 2022-4-20 13:25:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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__[name] = 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了,应该触发无限递归才是,但是实际上这段代码是正确的,请问这是为什么呀?
最佳答案
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__[name] = value,所以不会触发 __setattr__,也就是说最多就发生一次递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-20 15:28:51 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +2 鱼币

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

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

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

else 分支里面用的是 self.__dict__[name] = value,所以不会触发 __setattr__,也就是说最多就发生一次递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-20 17:48:59 | 显示全部楼层
isdkz 发表于 2022-4-20 15:28
在r.square = '10'的时候,__setattr__ 中的 name 为 'square',执行 if 分支,

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

感谢大佬,懂了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 02:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表