__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)

浙公网安备 33010602011771号