0与1 发表于 2020-7-13 16:06:35

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

因为不能上图,我只能手打说明了
在【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时,为什么不会进入无限循环了,我走不出来了。麻烦哪位大佬指点一下。

Twilight6 发表于 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

liuzhengyuan 发表于 2020-7-13 16:22:55

关于小甲鱼在06年python如果没记错的话 06 年没有 鱼C……

0与1 发表于 2020-7-13 16:23:35

哦哦
我代码打错了。。

0与1 发表于 2020-7-13 16:24:41

那为什么不会无限循环呢
之前的else里的赋值无限循环报错了
为什么if里的不会

Twilight6 发表于 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) 就是调用父类的意思

0与1 发表于 2020-7-13 16:29:04

但是在if里会执行else里的调用父类的语句吗?

0与1 发表于 2020-7-13 16:32:24

liuzhengyuan 发表于 2020-7-13 16:22
如果没记错的话 06 年没有 鱼C……

哈哈,是16年,抱歉抱歉,失误太多了

Twilight6 发表于 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 也是同理

0与1 发表于 2020-7-13 16:42:32

明白了,谢谢。

永恒的蓝色梦想 发表于 2020-7-13 17:27:53

小甲鱼在06年没有出 Python 教程
页: [1]
查看完整版本: 【问题求助】关于小甲鱼在06年python教学视频中的代码的疑惑