鱼C论坛

 找回密码
 立即注册
查看: 2207|回复: 6

[已解决]第46课 课上的循环看不懂

[复制链接]
发表于 2020-12-22 01:20:44 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 17623095765 于 2020-12-22 13:29 编辑
  1. # p12_5.py
  2. class Rectangle:
  3.     def __init__(self, width=0, height=0):
  4.         self.width = width
  5.         self.height = height

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

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

  1. >>>r1=Rectangle(4,5)
  2. >>>r1.getArea()
  3. 20
  4. >>>square=10
复制代码

当square=10时,触发__setattr__,调用if里面的 self.width=value,也就是r1.width=10,这里出现‘=’,那么应该调用__setattr__,因为‘name’==‘square’,然后无限递归下去。
但是不会,不知道哪里错了。
最佳答案
2020-12-22 10:19:11
本帖最后由 小伤口 于 2020-12-22 10:20 编辑
  1. >>> r1=Rectangle(4,5)
  2. >>> r1.getArea()
  3. 20
  4. >>> r1.square=10
  5. >>> r1.getArea()
  6. 100
  7. >>>
复制代码

这样调用才会触发__setattr__,
square=10这样不过是普通赋值而已
话说你用的是 r1=Rectangle(4,5)
为什莫 你写成 r.getArea()这样也能出结果
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-22 10:19:11 | 显示全部楼层    本楼为最佳答案   
本帖最后由 小伤口 于 2020-12-22 10:20 编辑
  1. >>> r1=Rectangle(4,5)
  2. >>> r1.getArea()
  3. 20
  4. >>> r1.square=10
  5. >>> r1.getArea()
  6. 100
  7. >>>
复制代码

这样调用才会触发__setattr__,
square=10这样不过是普通赋值而已
话说你用的是 r1=Rectangle(4,5)
为什莫 你写成 r.getArea()这样也能出结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 13:32:36 | 显示全部楼层
小伤口 发表于 2020-12-22 10:19
这样调用才会触发__setattr__,
square=10这样不过是普通赋值而已
话说你用的是 r1=Rectangle(4,5)

魔法方法不是自动调用的吗? 因为改了__setattr__,那么我每次赋值应该都会触发__setattr__呀?
(那里打少了一个1,改过来了)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 14:04:36 | 显示全部楼层
17623095765 发表于 2020-12-22 13:32
魔法方法不是自动调用的吗? 因为改了__setattr__,那么我每次赋值应该都会触发__setattr__呀?
(那里打 ...

r1.square意思是调用Rectangle对象里的square
是让python分辨出你的square是普通的还是对象里面的
与魔法方法是自动调用的并不冲突
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 15:30:22 | 显示全部楼层
本帖最后由 17623095765 于 2020-12-22 15:35 编辑
小伤口 发表于 2020-12-22 10:19
这样调用才会触发__setattr__,
square=10这样不过是普通赋值而已
话说你用的是 r1=Rectangle(4,5)


为了方便,我加了步骤
  1. class Rectangle:
  2.    
  3.     def __init__(self, width=0, height=0):
  4.         print('执行__init__')
  5.         
  6.         self.width = width
  7.         print('__init__中的self.width')
  8.         
  9.         self.height = height
  10.         print('__init__中的self.height')


  11.     def __setattr__(self, name, value):
  12.         print('__setattr__被调用')
  13.         
  14.         if name == 'square':
  15.             print('if正在被调用')
  16.             
  17.             self.width = value
  18.             print('if中的self.width = value')
  19.             
  20.             self.height = value
  21.             print('if中的self.height = value')
  22.    
  23.         else:
  24.             print('else被调用')
  25.             super().__setattr__(name,value)


  26.     def getArea(self):
  27.         print('getArea被调用')
  28.         return self.width * self.height
复制代码


是在r1.square=10就调用了__setattr__,在r1.square=10执行了第一次if后  为什么第二次去执行了else?,这个时候name还是square呀?

  1. >>> r1=Rectangle(4,5)
  2. 执行__init__
  3. __setattr__被调用
  4. else被调用
  5. __init__中的self.width
  6. __setattr__被调用
  7. else被调用
  8. __init__中的self.height

  9. >>> r1.getArea()
  10. getArea被调用
  11. 20

  12. >>> r1.square=10
  13. __setattr__被调用
  14. if正在被调用
  15. __setattr__被调用
  16. else被调用
  17. if中的self.width = value
  18. __setattr__被调用
  19. else被调用
  20. if中的self.height = value

  21. >>> r1.getArea()
  22. getArea被调用
  23. 100
复制代码

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

使用道具 举报

 楼主| 发表于 2020-12-22 15:42:43 | 显示全部楼层
小伤口 发表于 2020-12-22 14:04
r1.square意思是调用Rectangle对象里的square
是让python分辨出你的square是普通的还是对象里面的
与魔 ...

我明白了  第二次是self.width = value  也就是r1.width=10
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 16:37:27 | 显示全部楼层
17623095765 发表于 2020-12-22 15:42
我明白了  第二次是self.width = value  也就是r1.width=10

可以这么理解,可惜你码这么多字了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-30 01:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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