鱼C论坛

 找回密码
 立即注册
查看: 803|回复: 11

[已解决]p46 魔法方法属性访问问题

[复制链接]
发表于 2020-6-17 09:28:00 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 天下有敌 于 2020-6-17 10:25 编辑

为什么黄框内的 self.name = value   会触发魔法方法 __setattr__      所以无限递归  调用基类魔法方法就没事了
那红框内的赋值操作怎么就不会 触发  魔法方法  导致无限递归呢?


顺便问一下怎么删帖删评论?
最佳答案
2020-6-17 10:27:43
天下有敌 发表于 2020-6-17 10:20
我就是想问为什么去掉self.name = value就不会无限递归了,  self.width = value     self.height = valu ...

因为你  self.name = value 时候会导致你触发   __setattr__

而触发  __setattr__ 然后又开始判断 if 此时  name 不为 square  然后又执行 else 里面的 语句

调用父类成功赋值完后 又遇到  self.name = value  然后 又进入  __setattr__ ....就是这样无限循环

而去掉 self.name = value 呢?

那么就只调用了 super() 的父类方法 里面没有继续赋值 也就不会产生递归

而 self.width 赋值 因为 width 不等于 square 然后 调用 else 后 只调用了 super() 的父类方法 然后就结束了

并不会导致递归

小甲鱼代码

小甲鱼代码
无济于事.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-17 09:34:30 | 显示全部楼层
如果按照你图片上的代码  两个情况都会递归,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 09:42:17 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-17 09:43 编辑

楼主看看这个帖子吧,和你这个情况是一样的 , 只是你的多了个 if 判断 但是赋值时候都会导致一直执行 else 而造成无限递归


https://fishc.com.cn/forum.php?m ... 325&pid=4767270


只要帖子有评论,就不能删帖 删评论 ,话说为什么要删评论?


是不喜欢我来解答是吗?

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

使用道具 举报

 楼主| 发表于 2020-6-17 09:47:03 | 显示全部楼层
Twilight6 发表于 2020-6-17 09:34
如果按照你图片上的代码  两个情况都会递归,


不会,我试过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-17 09:48:25 | 显示全部楼层
Twilight6 发表于 2020-6-17 09:42
楼主看看这个帖子吧,和你这个情况是一样的 , 只是你的多了个 if 判断 但是赋值时候都会导致一直执行 else ...

不是,主要是我的悬赏帖,我自己查资料解决了,我想把悬赏的鱼币搞回来

评分

参与人数 1鱼币 +5 收起 理由
Twilight6 + 5

查看全部评分

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

使用道具 举报

发表于 2020-6-17 09:49:19 | 显示全部楼层

会的   你去掉 self.name = value 才不会无限递归 否则 就是会无限递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 09:49:44 | 显示全部楼层
你只要有传值或赋值的操作,这个方法就会被自动调用。

所以说修改类的底层是很危险的,用途也少,不用钻牛角尖,继续往后学就行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 09:49:57 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-17 09:51 编辑
天下有敌 发表于 2020-6-17 09:48
不是,主要是我的悬赏帖,我自己查资料解决了,我想把悬赏的鱼币搞回来


你这个是单纯的求助帖子,是没有设置悬赏的

而且这些问题发普通求助帖就好,不用设悬赏也会有鱼油来解答的


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

使用道具 举报

 楼主| 发表于 2020-6-17 10:00:54 | 显示全部楼层
Twilight6 发表于 2020-6-17 09:49
你这个是单纯的求助帖子,是没有设置悬赏的

而且这些问题发普通求助帖就好,不用设悬赏也会有鱼油来 ...

我有一个悬赏帖,你看我主页的主题有一个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 10:02:16 | 显示全部楼层
天下有敌 发表于 2020-6-17 10:00
我有一个悬赏帖,你看我主页的主题有一个。

这个没办法了  没事 我鱼币多 刚刚补你 5 个了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-17 10:20:32 | 显示全部楼层
Twilight6 发表于 2020-6-17 09:49
会的   你去掉 self.name = value 才不会无限递归 否则 就是会无限递归

我就是想问为什么去掉self.name = value就不会无限递归了,  self.width = value     self.height = value就不会无限递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 10:27:43 | 显示全部楼层    本楼为最佳答案   
天下有敌 发表于 2020-6-17 10:20
我就是想问为什么去掉self.name = value就不会无限递归了,  self.width = value     self.height = valu ...

因为你  self.name = value 时候会导致你触发   __setattr__

而触发  __setattr__ 然后又开始判断 if 此时  name 不为 square  然后又执行 else 里面的 语句

调用父类成功赋值完后 又遇到  self.name = value  然后 又进入  __setattr__ ....就是这样无限循环

而去掉 self.name = value 呢?

那么就只调用了 super() 的父类方法 里面没有继续赋值 也就不会产生递归

而 self.width 赋值 因为 width 不等于 square 然后 调用 else 后 只调用了 super() 的父类方法 然后就结束了

并不会导致递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 16:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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