鱼C论坛

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

__setattr__魔法方法问题

[复制链接]
发表于 2020-2-27 10:51:06 | 显示全部楼层 |阅读模式

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

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

x
在第45节中,有如下代码,定义了一个矩形的类。初始化时给出长和宽。
赋值操作中:如果给一个叫做“square”的属性赋值时,那么知道是正方形,则长和宽都等于新的值 value
                     如果不是,则正常赋值

class FF:
    def  __init__(self,x,y):
        self.l = x
        self.w = y

    def  __setattr__(self,nn,value):
        if  nn == 'square' :
            self.l = value
            self.w = value
        else:
            #self.nn = value
            super().__setattr__(nn,value)
       
     #求面积
    def  getarea(self):
        return  self.l * self.w


       
在else语句中,用super语句替换了代码中被注释掉的那一行。否则在实例化时就会变成死循环。
比如:t = FF(3,6), 在init魔法方法中,self.l = 3 ,那么触发setattr魔法方法,执行else语句 : self.l =3  ,那么又触发 setattr魔法方法,一直这样循环。


我的问题 :
        当执行  t.square = 10 , 也就是将这个矩形定义为正方形。这个赋值为什么不触发死循环呢 ?
我的想法:
       当执行if语句的 self.l =10 ,不是和上面一样,再次触发setattr魔法方法吗 ?

那么大神有空,帮忙解答一下,万分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-27 10:54:05 | 显示全部楼层
super().__setattr__(nn,value)

这一句是调用父类的 __setattr__,不会触发死循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-27 11:15:24 | 显示全部楼层
zltzlt 发表于 2020-2-27 10:54
这一句是调用父类的 __setattr__,不会触发死循环。

麻烦仔细看一下,我的题目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 11:35:19 | 显示全部楼层
t.square = 10 只触发一次循环
然后self.l ,self.w 的赋值就不触发循环了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-27 13:22:17 | 显示全部楼层
walleeee 发表于 2020-2-27 11:35
t.square = 10 只触发一次循环
然后self.l ,self.w 的赋值就不触发循环了

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

使用道具 举报

发表于 2020-2-27 13:25:34 From FishC Mobile | 显示全部楼层
self.l  不是直接触发super()...事件吗,也就是按照正常定义走
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-27 18:02:16 | 显示全部楼层
臭某人 发表于 2020-2-27 13:25
self.l  不是直接触发super()...事件吗,也就是按照正常定义走

那为什么被注释掉的 : self.nn = value ,就不会触发super()_____ 呢 ?  我就是想知道为什么一个触发了无限递归,另一个看起来长的一样的代码就不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-24 13:57:55 | 显示全部楼层
smallszg 发表于 2020-2-27 18:02
那为什么被注释掉的 : self.nn = value ,就不会触发super()_____ 呢 ?  我就是想知道为什么一个触发了 ...

因为如果用注释掉的self.nn = value,那就没有super()这句了,你不是用super()换掉了原来的self.nn = value吗,所以这样的话一次循环以后跳去else里面的super了。如果是原来的self.nn = value,那循环以后又跳到self.nn = value,因为没有super语句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 20:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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