今天的我更强了 发表于 2020-6-16 12:39:20

属性访问

def __setattr__(self,name,value):
    self.name=value+1
这个self.name=value+1会出发无限递归

class C:
    def __setattr__(self,name,value):
      value+=1
      super().__setattr__(name,value)
就能够运行处结果,不都是赋值操作吗?为什么第二种不会出发无线递归

永恒的蓝色梦想 发表于 2020-6-16 12:40:41

第一种的=还是在调用自己,第二种则是调用了 object 的方法。

Twilight6 发表于 2020-6-16 12:40:46

本帖最后由 Twilight6 于 2020-6-16 12:41 编辑



第一个是调用自己的 __setattr__ 方法

而第二个调用的是父类的 __setattr__ 所以当代码运行到这就去找父类的 __setattr__方法了

而不是找自己的 __setattr__ 方法所以不会无限递归了~

今天的我更强了 发表于 2020-6-16 17:24:59

Twilight6 发表于 2020-6-16 12:40
第一个是调用自己的 __setattr__ 方法

而第二个调用的是父类的 __setattr__ 所以当代码运行到这就去 ...

也就是说第二个调用了后面的super().__setattr__(name,value)方法吗

Twilight6 发表于 2020-6-16 17:27:15

今天的我更强了 发表于 2020-6-16 17:24
也就是说第二个调用了后面的super().__setattr__(name,value)方法吗

应该是说调用了基类(也称可父类) 的 方法

Python 中如果没有设置继承,那么默认继承都是 object 类也就是基类,基类有__setattr__(name,value) 这个魔法方法,这里就是调用基类的 __setattr__(name,value)方法

今天的我更强了 发表于 2020-6-16 17:36:58

Twilight6 发表于 2020-6-16 17:27
应该是说调用了基类(也称可父类) 的 方法

Python 中如果没有设置继承,那么默认继承都是 object 类   ...

懂了 谢谢
页: [1]
查看完整版本: 属性访问