鱼C论坛

 找回密码
 立即注册
查看: 2104|回复: 10

[已解决]一个关于无限递归的小问题

[复制链接]
发表于 2017-8-14 11:42:01 | 显示全部楼层 |阅读模式

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

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

x
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

见结尾打?的,为了防止无限递归,else后用了super(),但是if后为什么就可以不用调用基类的方法而防止递归呢

谢谢大家了
最佳答案
2017-8-14 11:59:25
本帖最后由 MSK 于 2017-8-14 12:02 编辑

改一下代码:
  1. class Rectangle:
  2.     def __init__(self, width=0, height=0):
  3.         self.width = width
  4.         self.height = height

  5.     def __setattr__(self, name, value):
  6.         if name == 'square':            
  7.             self.width = value           
  8.             self.height = value         
  9.         else:
  10.             print('设置属性..')
  11.             super().__setattr__(name,value)  

  12.     def getArea(self):
  13.         return self.width * self.height
复制代码


运行结果:
  1. >>> rect = Rectangle()
  2. 设置属性..
  3. 设置属性..
  4. >>> rect.square = 8
  5. 设置属性..
  6. 设置属性..
复制代码


原因很简单,当执行self.width = value self.height = value时同样产生递归,
只不过递归时进入了else所在的语块,通过super对width,height属性进行了赋值


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-8-14 11:59:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 MSK 于 2017-8-14 12:02 编辑

改一下代码:
  1. class Rectangle:
  2.     def __init__(self, width=0, height=0):
  3.         self.width = width
  4.         self.height = height

  5.     def __setattr__(self, name, value):
  6.         if name == 'square':            
  7.             self.width = value           
  8.             self.height = value         
  9.         else:
  10.             print('设置属性..')
  11.             super().__setattr__(name,value)  

  12.     def getArea(self):
  13.         return self.width * self.height
复制代码


运行结果:
  1. >>> rect = Rectangle()
  2. 设置属性..
  3. 设置属性..
  4. >>> rect.square = 8
  5. 设置属性..
  6. 设置属性..
复制代码


原因很简单,当执行self.width = value self.height = value时同样产生递归,
只不过递归时进入了else所在的语块,通过super对width,height属性进行了赋值


评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
豆呐呐 + 5 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-14 12:00:20 | 显示全部楼层

你说得对,竟然跟我想的一模一样!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-14 12:01:46 | 显示全部楼层
新手·ing 发表于 2017-8-14 12:00
你说得对,竟然跟我想的一模一样!!!

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-14 12:03:16 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-14 12:30:22 | 显示全部楼层
新手·ing 发表于 2017-8-14 12:00
你说得对,竟然跟我想的一模一样!!!

你们真是大佬所见略同=。=
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-14 12:31:01 | 显示全部楼层

蟹蟹啦大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-14 12:45:25 | 显示全部楼层
__setattr__(self, name, value)        定义当一个属性被设置时的行为

2017-08-14_122429.png
2017-08-14_124304.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-14 12:56:50 | 显示全部楼层
ba21 发表于 2017-8-14 12:45
__setattr__(self, name, value)        定义当一个属性被设置时的行为

嗯嗯谢谢大佬啦,我还想问那个width和height的默认值被设置为0时候会不会也出发了__setattr__呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-14 12:57:41 | 显示全部楼层
豆呐呐 发表于 2017-8-14 12:56
嗯嗯谢谢大佬啦,我还想问那个width和height的默认值被设置为0时候会不会也出发了__setattr__呢?

__setattr__方法.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-14 13:03:01 | 显示全部楼层

啊明白啦哈哈,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 13:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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