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 21:20 编辑
wuyanzulqq 发表于 2020-11-25 21:05
也就是说魔法方法是对属性赋值才会触发的,而字典不是属性就不会触发?
对的,魔法方法是是对类的属性赋值会触发,对字典不使用__setattri__魔法方法。你想想嘛,魔法方法输入参数是self, name 和values,是对类的实例化的修改,不是字典的参数 本帖最后由 wuyanzulqq 于 2020-11-25 20:10 编辑
求解答{:10_266:} 问题一:父类的__setattr__是基类的__setattr__,和你自己写的Rectangle类的__setattr__没关系。所以不涉及self.name = value再次赋值以再次调用Rectangle类的__setattr__。也就是说父类__setattr__更稳定
问题二:self.__dict__ = value 是字典赋值,字典赋值方法不用用到__setattr__方法,自然不用再次进行self.name = value,然后再次调用Rectangle类的__setattr__。也就不存在递归了 kleineweiss 发表于 2020-11-25 20:55
问题一:父类的__setattr__是基类的__setattr__,和你自己写的Rectangle类的__setattr__没关系。所以不涉及s ...
也就是说魔法方法是对属性赋值才会触发的,而字典不是属性就不会触发?{:5_94:}
页:
[1]