__setattr__陷阱
引子:
使用 对象.xxx=213 这种方法赋值的时候 会隐式的调用__setattr__方法
代码:
# -*- coding: utf-8 -*- class foo(object): def __init__(self): self.storage={} def __setattr__(self, key, value): self.storage={"k1":"v1"} print(key,value) def __getattr__(self, item): print(item) return "dsfds" """ 陷阱 如果代码这样写 会报递归深度错误 推倒过程如下 1 obj=foo() 会调用__init__() 方法,其内部的self.storage={} 会调用 __setattr__ 方法 2 __setattr__ 内部又调用了self.storage={"k1":"v1"} 又一次调用 __setattr__ 3 最终超过最大递归深度 报错 ps: 对象.xx=234 这种调用的时候默认隐式调用__setattr__ 方法 """ obj=foo() obj.x=77 # 解决方法 调用父类的 __setattr__ class cls_a: def __init__(self): object.__setattr__(self,"storage",{})
类中如果使用了其他的方法名字 代替了__setattr__的时候就不会出现这种问题 下方代码 set方法中调用了 __setattr__方法
class Local(object): def __init__(self): self.storage={} self.get_ident=get_ident def set(self,k,v): ident=self.get_ident() orgin=self.storage.get(ident) if not orgin: orgin={k:v} else: orgin[k]=v self.storage[ident]=orgin def get(self,k): ident=self.get_ident() orgin=self.storage.get(ident) if not orgin: return None return orgin.get(k,None)