鱼C论坛

 找回密码
 立即注册
查看: 1787|回复: 4

[已解决]python 45讲 课堂疑问

[复制链接]
发表于 2020-11-25 17:58:10 | 显示全部楼层 |阅读模式
10鱼币
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

两个问题哈
这里甲鱼哥说有两种方法可以解决这里的递归问题:一种是调用父类,另一种是特殊属性__dict__
问题一:为什么调用父类object的__setattr__不会重复调用无限递归
问题而:为什么用__dict__不会调用无限递归啊,甲鱼哥的改写方式是这样的:self.__dict__[name] = value 这里操作是添加向字典元素,如果要调用的话,就是类对象.__dict__就会显示{'self.width':4,'self.height':5}的吧?
我感觉似懂非懂的  求详解
最佳答案
2020-11-25 17:58:11
本帖最后由 kleineweiss 于 2020-11-25 21:20 编辑
wuyanzulqq 发表于 2020-11-25 21:05
也就是说魔法方法是对属性赋值才会触发的,而字典不是属性就不会触发?


对的,魔法方法是是对类的属性赋值会触发,对字典不使用__setattri__魔法方法。你想想嘛,魔法方法输入参数是self, name 和values,是对类的实例化的修改,不是字典的参数

最佳答案

查看完整内容

对的,魔法方法是是对类的属性赋值会触发,对字典不使用__setattri__魔法方法。你想想嘛,魔法方法输入参数是self, name 和values,是对类的实例化的修改,不是字典的参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-25 17:58:11 | 显示全部楼层    本楼为最佳答案   
本帖最后由 kleineweiss 于 2020-11-25 21:20 编辑
wuyanzulqq 发表于 2020-11-25 21:05
也就是说魔法方法是对属性赋值才会触发的,而字典不是属性就不会触发?


对的,魔法方法是是对类的属性赋值会触发,对字典不使用__setattri__魔法方法。你想想嘛,魔法方法输入参数是self, name 和values,是对类的实例化的修改,不是字典的参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-25 19:37:44 | 显示全部楼层
本帖最后由 wuyanzulqq 于 2020-11-25 20:10 编辑

求解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-25 20:55:43 | 显示全部楼层
问题一:父类的__setattr__是基类的__setattr__,和你自己写的Rectangle类的__setattr__没关系。所以不涉及self.name = value再次赋值以再次调用Rectangle类的__setattr__。也就是说父类__setattr__更稳定
问题二:self.__dict__[name] = value 是字典赋值,字典赋值方法不用用到__setattr__方法,自然不用再次进行self.name = value,然后再次调用Rectangle类的__setattr__。也就不存在递归了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-25 21:05:45 | 显示全部楼层
kleineweiss 发表于 2020-11-25 20:55
问题一:父类的__setattr__是基类的__setattr__,和你自己写的Rectangle类的__setattr__没关系。所以不涉及s ...

也就是说魔法方法是对属性赋值才会触发的,而字典不是属性就不会触发?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 07:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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