第一个程序:
首先,他这里这样写的目的是展现__getattribute__()和__getattr__()的工作方式,所以__getattribute__下的
super()一定要写,不然就没法再属性不存在时调用__getattr__了
而__getattr__下的super()可写可不写,区别就是如果不写,c.x返回值如图所示,如果写了,super().__getattr__(name) ,那么在c.x时,会打印 getattribution 和getattr 然后报错,因为c.x并不存在,又没有设定属性不存在的返回值
第二个程序:
当他写 r1.square=10时,传入的参数是(self,square,10)执行if语句
然后执行 self.width=value ,此时再次调用__setattr__(),传入的参数是(self,width,10)
此时执行的是else语句,super()
然后再执行self.height=value 时,过程和上面self.width=value一样的。
实际上当执行if里的语句时,因为再次发生赋值,再次调用后符合的是else的条件,所以不会无限循环,实际上r1.square属性根本没有写入,访问r1.square会报错
如果在if语句下添加 self.square=value,就会无限循环了