smallszg 发表于 2020-2-27 10:51:06

__setattr__魔法方法问题

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

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

    def__setattr__(self,nn,value):
      ifnn == 'square' :
            self.l = value
            self.w = value
      else:
          #self.nn = value
            super().__setattr__(nn,value)
       
   #求面积
    defgetarea(self):
      returnself.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魔法方法吗 ?

那么大神有空,帮忙解答一下,万分感谢

zltzlt 发表于 2020-2-27 10:54:05

super().__setattr__(nn,value)

这一句是调用父类的 __setattr__,不会触发死循环。

smallszg 发表于 2020-2-27 11:15:24

zltzlt 发表于 2020-2-27 10:54
这一句是调用父类的 __setattr__,不会触发死循环。

麻烦仔细看一下,我的题目

walleeee 发表于 2020-2-27 11:35:19

t.square = 10 只触发一次循环
然后self.l ,self.w 的赋值就不触发循环了

smallszg 发表于 2020-2-27 13:22:17

walleeee 发表于 2020-2-27 11:35
t.square = 10 只触发一次循环
然后self.l ,self.w 的赋值就不触发循环了

为什么 ?

臭某人 发表于 2020-2-27 13:25:34

self.l不是直接触发super()...事件吗,也就是按照正常定义走

smallszg 发表于 2020-2-27 18:02:16

臭某人 发表于 2020-2-27 13:25
self.l不是直接触发super()...事件吗,也就是按照正常定义走

那为什么被注释掉的 : self.nn = value ,就不会触发super()_____ 呢 ?我就是想知道为什么一个触发了无限递归,另一个看起来长的一样的代码就不会

hzrenx 发表于 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语句
页: [1]
查看完整版本: __setattr__魔法方法问题