__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魔法方法吗 ?
那么大神有空,帮忙解答一下,万分感谢 super().__setattr__(nn,value)
这一句是调用父类的 __setattr__,不会触发死循环。 zltzlt 发表于 2020-2-27 10:54
这一句是调用父类的 __setattr__,不会触发死循环。
麻烦仔细看一下,我的题目 t.square = 10 只触发一次循环
然后self.l ,self.w 的赋值就不触发循环了 walleeee 发表于 2020-2-27 11:35
t.square = 10 只触发一次循环
然后self.l ,self.w 的赋值就不触发循环了
为什么 ? self.l不是直接触发super()...事件吗,也就是按照正常定义走
臭某人 发表于 2020-2-27 13:25
self.l不是直接触发super()...事件吗,也就是按照正常定义走
那为什么被注释掉的 : self.nn = value ,就不会触发super()_____ 呢 ?我就是想知道为什么一个触发了无限递归,另一个看起来长的一样的代码就不会 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]