wuyanzulqq 发表于 2020-11-25 17:58:10

python 45讲 课堂疑问

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__ = value 这里操作是添加向字典元素,如果要调用的话,就是类对象.__dict__就会显示{'self.width':4,'self.height':5}的吧?
我感觉似懂非懂的求详解

kleineweiss 发表于 2020-11-25 17:58:11

本帖最后由 kleineweiss 于 2020-11-25 21:20 编辑

wuyanzulqq 发表于 2020-11-25 21:05
也就是说魔法方法是对属性赋值才会触发的,而字典不是属性就不会触发?

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

wuyanzulqq 发表于 2020-11-25 19:37:44

本帖最后由 wuyanzulqq 于 2020-11-25 20:10 编辑

求解答{:10_266:}

kleineweiss 发表于 2020-11-25 20:55:43

问题一:父类的__setattr__是基类的__setattr__,和你自己写的Rectangle类的__setattr__没关系。所以不涉及self.name = value再次赋值以再次调用Rectangle类的__setattr__。也就是说父类__setattr__更稳定
问题二:self.__dict__ = value 是字典赋值,字典赋值方法不用用到__setattr__方法,自然不用再次进行self.name = value,然后再次调用Rectangle类的__setattr__。也就不存在递归了

wuyanzulqq 发表于 2020-11-25 21:05:45

kleineweiss 发表于 2020-11-25 20:55
问题一:父类的__setattr__是基类的__setattr__,和你自己写的Rectangle类的__setattr__没关系。所以不涉及s ...

也就是说魔法方法是对属性赋值才会触发的,而字典不是属性就不会触发?{:5_94:}
页: [1]
查看完整版本: python 45讲 课堂疑问