python面向对象
1、类中的__setattr__、__getattr__、__delattr__ 方法;
class Test(object):
def __init__(self):
self.storage = {}
def __setattr__(self, key, value):
self.storage[key] = value
def __getattr__(self, item):
return self.storage.get(item) # 会提示改行报错:RecursionError: maximum recursion depth exceeded
# 分析:在init中 self.storage = {} 会调用 __setattr__ 方法进行属性设置,而 __setattr__ 方法中的 self.storage[key] 相当于获取
# 获取属性值,会调用 __getattribute__ 方法,然而 __getattribute__ 方法中的 self.storage.get(item) 相当于获取 self.storage 的
# 值,从而有会调用 __getattribute__ 的方法,如此循环;
obj = Test()
obj.data = 32
print(obj.data)
改进
class Test(object):
def __init__(self):
object.__setattr__(self, "storage", {}) # 显示调用父类的属性设置方法来进行属性设置,避免当前对象出现循环调用自身的 __getattr__
# self.storage = {}
def __setattr__(self, key, value):
self.storage[key] = value
def __getattr__(self, item):
return self.storage.get(item)
test = Test()
test.data = 32
print(test.data)

浙公网安备 33010602011771号