鱼C论坛

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

讲义45中的问题

[复制链接]
发表于 2015-11-4 23:39:09 | 显示全部楼层 |阅读模式
3鱼币
当设置属性的时候就会调用__setattr__,视频中改过之后,在设置square属性的时候,不是也有self.width=value这样的赋值语句吗?此时为什么不调用__setattr__函数?为什么不会造成死循环?
snapshot20151104233408.jpg
snapshot20151104233937.jpg

最佳答案

查看完整内容

你看:当执行 r1.square = 10 的时候,会进入 __setattr__() 中,进入之后会执行 self.width = value,你的问题是为何此时不会进入递归? 这个问题问得好…… 你接着往下模拟,调用 self.width = value 仍然会再次进入 __setattr__(),而此时会执行 else 的 super().__setattr__() 来防止递归现象的发生,因此……任何不好的事情都没有继续发生! 快,给分吧!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-4 23:39:10 | 显示全部楼层
你看:当执行 r1.square = 10 的时候,会进入 __setattr__() 中,进入之后会执行 self.width = value,你的问题是为何此时不会进入递归?

这个问题问得好……

你接着往下模拟,调用 self.width = value 仍然会再次进入 __setattr__(),而此时会执行 else 的 super().__setattr__() 来防止递归现象的发生,因此……任何不好的事情都没有继续发生!

快,给分吧!!

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-5 01:20:14 | 显示全部楼层
不明白你说的是什么意思 为什么会形成死循环啊

我把我的理解给你说说吧

__setattr__()是魔法函数,他会在你执行特定的’动作‘的时候有编译器自动执行,而那个特定的’动作‘就是你的 给对象的属性赋值动作,编译器其实是重载了你的 r1.square = 10 这个代码 意思就是用 __setattr__()函数来执行你的赋值动作,在泪中定义的对象赋值函数是不会重载魔法函数的,编译器就是这么工作的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-5 12:29:30 | 显示全部楼层
小甲鱼 发表于 2015-11-4 23:39
你看:当执行 r1.square = 10 的时候,会进入 __setattr__() 中,进入之后会执行 self.width = value,你的 ...

恩恩。感谢小甲鱼:hug:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-18 22:16:54 | 显示全部楼层
终于看到想要的答案了,要哭晕了!!!!!!!!!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-5-28 23:31:02 From FishC Mobile | 显示全部楼层
想了一晚上,各种百度,终于找到答案了!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-18 04:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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