鱼C论坛

 找回密码
 立即注册
查看: 1682|回复: 10

[已解决]【问题求助】关于小甲鱼在06年python教学视频中的代码的疑惑

[复制链接]
发表于 2020-7-13 16:06:35 | 显示全部楼层 |阅读模式

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

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

x
因为不能上图,我只能手打说明了
在【045 魔法方法 属性访问】中,一次关于__attribute__的无限循环的演示中
代码:

class Rectangle:
    def __init__(self, width = 0, height = 0):
        self.width = 0
        self.height = 0

    def __setattr__(self, name, value):
        if name == 'square':
            self.width = value
            self.height = value
        else:
            super().__setattr__(name, value)

    def getArea(self):
        return self.width * self.height

当输入square=10时,为什么不会进入无限循环了,我走不出来了。麻烦哪位大佬指点一下。
最佳答案
2020-7-13 16:34:53
0与1 发表于 2020-7-13 16:29
但是在if里会执行else里的调用父类的语句吗?


不会 if 会调用自己的 __setattr__ 方法,比如 self.width = value 那么此时调用自己的 __setattr__  方法时候

name 变成了 width ,所以执行 else ,重新调用了super().__setattr__(name, value) 来给  self.width = value  赋值

而 if 里的 self.height = value 也是同理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-13 16:14:11 | 显示全部楼层

这里代码都不会进入无限递归的,而且你代码的 __init__ 有些错误, self.width 应该等于 width 而不是 0 ,self.height 也是同理
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
            self.height = value
        else:
            super().__setattr__(name, value)

    def getArea(self):
        return self.width * self.height
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 16:22:55 | 显示全部楼层
关于小甲鱼在06年python
如果没记错的话 06 年没有 鱼C……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 16:23:35 | 显示全部楼层
哦哦
我代码打错了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 16:24:41 | 显示全部楼层
那为什么不会无限循环呢
之前的else里的赋值无限循环报错了
为什么if里的不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 16:27:11 | 显示全部楼层
0与1 发表于 2020-7-13 16:24
那为什么不会无限循环呢
之前的else里的赋值无限循环报错了
为什么if里的不会


因为你调用了父类的__setattr__(name, value) 方法来进行 赋值属性,而不是调用自己的__setattr__(name, value) 方法

这里的  super().__setattr__(name, value) 就是调用父类的意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 16:29:04 | 显示全部楼层
但是在if里会执行else里的调用父类的语句吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 16:32:24 | 显示全部楼层
liuzhengyuan 发表于 2020-7-13 16:22
如果没记错的话 06 年没有 鱼C……

哈哈,是16年,抱歉抱歉,失误太多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 16:34:53 | 显示全部楼层    本楼为最佳答案   
0与1 发表于 2020-7-13 16:29
但是在if里会执行else里的调用父类的语句吗?


不会 if 会调用自己的 __setattr__ 方法,比如 self.width = value 那么此时调用自己的 __setattr__  方法时候

name 变成了 width ,所以执行 else ,重新调用了super().__setattr__(name, value) 来给  self.width = value  赋值

而 if 里的 self.height = value 也是同理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 16:42:32 | 显示全部楼层
明白了,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 17:27:53 | 显示全部楼层
小甲鱼在06年没有出 Python 教程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 11:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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