鱼C论坛

 找回密码
 立即注册
查看: 1859|回复: 5

[已解决]小甲鱼45讲__setattr__无限递归问题

[复制链接]
发表于 2019-10-3 21:06:15 | 显示全部楼层 |阅读模式

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

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

x
class R:
        def __init__(self,width=0,height=0):
                self.width=width
                self.height=height
        def __setattr__(self,name,value):
                if name=='square':
                        self.width=value
                        self.height=value
                else:
                        self.__dict__[name]=value   #之前是self.name=value

我不懂__setattr__产生递归的原理,它是多次调用了自身吗,为什么if语句里的内容不会发生递归呢,它(self.width=value)为什么不是赋值调用自身呢?
       
最佳答案
2019-10-3 21:34:18
程序运行路线图:

假设执行 R().square = 5

self.width=5

self.__setattr__('width', 5)

self.__dict__['width']=5

self.height=5

self.__setattr__('height', 5)

self.__dict__['height']=5

程序结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-3 21:34:18 | 显示全部楼层    本楼为最佳答案   
程序运行路线图:

假设执行 R().square = 5

self.width=5

self.__setattr__('width', 5)

self.__dict__['width']=5

self.height=5

self.__setattr__('height', 5)

self.__dict__['height']=5

程序结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-10-5 14:20:35 | 显示全部楼层
zltzlt 发表于 2019-10-3 21:34
程序运行路线图:
假设执行 R().square = 5

谢谢啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-6 16:53:16 | 显示全部楼层
学习了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-23 11:06:58 | 显示全部楼层
插个眼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 22:47:57 | 显示全部楼层
zltzlt 发表于 2019-10-3 21:34
程序运行路线图:
假设执行 R().square = 5

你好,我还是不理解。一开始错误的代码中,r1=Rectangle(4,5),__init__方法中对属性self.width赋值4,然后自动调用__setattr__方法,执行__setattr__方法中的else分支self. name=value,即self.width=4,为什么不按你画的这个流程往下赋值,而会发生递归呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 07:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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