鱼C论坛

 找回密码
 立即注册
查看: 2394|回复: 6

[已解决]第45讲关于__setattr__递归的疑惑

[复制链接]
发表于 2018-8-7 01:00:13 | 显示全部楼层 |阅读模式

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

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

x
class Rect:
        def __init__(self,width=0,hight=0):
                self.width = width
                self.hight = hight
        def __setattr__(self,name,value):
                if name = 'zhengfangxing':
                        self.width = value
                        self.hight = value

                else:
                        super().__setattr__(name,value)

rect = Rect(4,5)
rect.zhengfangxing = 10
print(self.width)
这个代码中标红的部分,当执行到此代码块的时候按理说不同样会进入死循环么?对属性进行赋值,然后再次调用__setattr__ 方法。。。。。。
求指点迷津!
最佳答案
2018-8-7 08:26:00
我的理解,第一次,执行zhengfangxing = 100,调用__setattr__,if为True,执行红字部分,而红字部分又调用__setattr__,这时if为False,调用父类的__setattr__,就不再循环调用了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-7 08:19:17 | 显示全部楼层
只有对类的实例化对象赋值的时候才会调用那个类型的__setattr__(注意,不是那个类型里面的变量)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-7 08:26:00 | 显示全部楼层    本楼为最佳答案   
我的理解,第一次,执行zhengfangxing = 100,调用__setattr__,if为True,执行红字部分,而红字部分又调用__setattr__,这时if为False,调用父类的__setattr__,就不再循环调用了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-7 11:26:21 From FishC Mobile | 显示全部楼层
冬雪雪冬 发表于 2018-8-7 08:26
我的理解,第一次,执行zhengfangxing = 100,调用__setattr__,if为True,执行红字部分,而红字部分又调用 ...

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

使用道具 举报

 楼主| 发表于 2018-8-8 01:30:10 | 显示全部楼层
冬雪雪冬 发表于 2018-8-7 08:26
我的理解,第一次,执行zhengfangxing = 100,调用__setattr__,if为True,执行红字部分,而红字部分又调用 ...

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

使用道具 举报

发表于 2019-10-31 10:31:48 | 显示全部楼层
__init__(self[, ...])  构造器,当一个实例被创建的时候调用的初始化方法
__setattr__(self, name, value) 定义当一个属性被设置时的行为
class Rect:
        def __init__(self,width=0,hight=0):
                self.width = width
                self.hight = hight
        def __setattr__(self,name,value):
                if name = 'zhengfangxing':
                        self.width = value
                        self.hight = value
                else:
                        super().__setattr__(name,value)

rect = Rect(4,5)
rect.zhengfangxing = 10
print(self.width)
问题:这个代码中标红的部分,当执行到此代码块的时候按理说不同样会进入死循环么?对属性进行赋值,      然后再次调用__setattr__ 方法

解答:第一次,执行zhengfangxing = 10,调用__setattr__,if为True,执行红字部分,而红字部分又调用__setattr__,这时if为False,调用父类的__setattr__,就不再循环调用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-29 21:05:21 | 显示全部楼层
感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 21:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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