|
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:
self.name = value
def getArea(self):
return self.width *self.height
这是小甲鱼45讲魔法方法时的代码,这么写会因为一直给self.name赋值触发__setattr__导致程序死循环,改成super().__setattr__(name, value)后恢复正常
我有三个个问题
1.为什么if下面的赋值操作不会触发__setattr__()导致死循环
2.为什么在重写的这句 super().__setattr__(name, value)里面没有self参数了,这个难道不是魔法方法里固定的参数么?
3.书上写的可以改成self.__dict__[name] = value,请问为什么这样写就不算是这个类本身的属性了,不触发死循环么?
1.为什么if下面的赋值操作不会触发__setattr__()导致死循环
你的代码就算符合 if 条件也会进入死循环,甲鱼哥不会照成死循环的是因为 else 调用父类的__settatr__ 方法,而你这里并没有调用父类
而是重新赋值 self.name = value ,这个时候就会导致又进行了赋值操作,然后继续调用自身的 __setattr__ 方法
当你把 else 内容删去时候,你调用自己__setattr__ 方法时候,因为第二次递归 name 不会等于 square 所以不会进入 if 条件 ,也就不会照成无限递归
2.为什么在重写的这句 super().__setattr__(name, value)里面没有self参数了,这个难道不是魔法方法里固定的参数么?
super() 此时就代表着 self ,而且代表的是 父类,这和你实例化对象时候一个道理,你设置一个A类,__init__方法不是也有 self,但不需要你传入,就是因为 实例化时候会将实例对象自动传入
3.书上写的可以改成self.__dict__[name] = value,请问为什么这样写就不算是这个类本身的属性了,不触发死循环么?
你先要了解 __dict__属性,是查看对象内部所有属性名和属性值组成的字典的作用,你直接对字典这样 = 操作是添加元素,不是赋值操作,所以不会调用__settar__方法
|
最佳答案
查看完整内容
你的代码就算符合 if 条件也会进入死循环,甲鱼哥不会照成死循环的是因为 else 调用父类的__settatr__ 方法,而你这里并没有调用父类
而是重新赋值 self.name = value ,这个时候就会导致又进行了赋值操作,然后继续调用自身的 __setattr__ 方法
当你把 else 内容删去时候,你调用自己__setattr__ 方法时候,因为第二次递归 name 不会等于 square 所以不会进入 if 条件 ,也就不会照成无限递归
super() 此时就代表着 ...
|