鱼C论坛

 找回密码
 立即注册
查看: 2418|回复: 7

请教一个关于__setattr__中的无限递归的问题

[复制链接]
发表于 2017-2-6 11:01:42 | 显示全部楼层 |阅读模式

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

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

x
class  Rectangle:
        def __setattr__(self,name,value):
                if name=='square':
                        self.width=value
                        self.height=value
                else:
                        self.name=value
这个是第45讲的一个问题。 在 else 语句中会出现无线递归的问题,但是为什么在 if 中不会出现无线递归呢?是只有 self.name = value 才会自动调用__setattr__这个魔法方法么?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-2-6 12:31:40 | 显示全部楼层
在 if 中 会出现无线递归
  1. >>> rec=Rectangle()
  2. >>> rec.square=3
  3. Traceback (most recent call last):
  4.   File "<pyshell#7>", line 1, in <module>
  5.     rec.square=3
  6.   File "<pyshell#5>", line 4, in __setattr__
  7.     self.width=value
  8.   File "<pyshell#5>", line 7, in __setattr__
  9.     self.name=value
  10. ……
  11. RuntimeError: maximum recursion depth exceeded
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-6 18:14:24 | 显示全部楼层
假如name为square,然后就把value的值给self.width和self.height,然后又会调用
__setattr__,name分别为width和height,就不为square了,调用setattr就进入else,然后就递归了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-6 21:16:41 | 显示全部楼层
SixPy 发表于 2017-2-6 12:31
在 if 中 会出现无线递归

class  Rectangle:
        def __setattr__(self, name, value):
                if name=='square':
                        self.width=value
                        self.height=value
                else:
                        #self.name=value
                        super().__setattr__(name, value)
我好像没有说明白~  最后改成这样就可以了,但是只改了 else 语句中的, if 当中的不用改成 super 为什么可以呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-6 21:18:51 | 显示全部楼层
SixPy 发表于 2017-2-6 12:31
在 if 中 会出现无线递归

哎呦,我想明白了。谢谢了~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-6 21:20:22 | 显示全部楼层
什么鬼… 发表于 2017-2-6 18:14
假如name为square,然后就把value的值给self.width和self.height,然后又会调用
__setattr__,name分别为wid ...

恩,现在我想明白了。谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-7 00:51:58 | 显示全部楼层
表示这些内置方法 不是很熟悉啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-15 18:05:28 | 显示全部楼层
本帖最后由 arbsteven 于 2018-7-15 18:06 编辑

有个问题请教楼主,为啥setattr 会出现递归,但是小甲鱼写的温度转换的那里的def __set__(self,instance,value)却不会出现递归呢???
def __set__(self,instance,value):
        self.value=float(value)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-25 06:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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