cached_property/缓存属性
# cached_property 缓存属性
class cached_property(object):
"""
Decorator that converts a method with a single self argument into a
property cached on the instance.
Optional ``name`` argument allows you to make cached properties of other
methods. (e.g. url = cached_property(get_absolute_url, name=url) )
"""
def __init__(self, func, name=None):
# print(ff: {id(func)})
self.func = func
self.__doc__ = getattr(func, __doc__)
self.name = name or func.__name__
def __get__(self, instance, type=None):
# print(fself func: {id(self.func)})
# print(finstance: {id(instance)})
if instance is None:
return self
res = instance.__dict__[self.name] = self.func(instance)
return res
class F00():
@cached_property
def test(self):
# cached_property 将会把每个实例的属性存储到实例的__dict__中, 实例获取属性时, 将会优先从__dict__中获取,则不会再次调用方法内部的过程
print(f运行test方法内部过程)
return 3
@property
def t(self):
print(运行t方法内部过程)
return 44
f = F00()
print(f.test) # 第一次将会调用test方法内部过程
print(f.test) # 再次调用将直接从实例中的__dict__中直接获取,不会再次调用方法内部过程
print(f.t) # 调用方法内部过程取值
print(f.t) # 调用方法内部过程取值
# 结果输出
# 运行test方法内部过程
# 3
# 3
# 运行t方法内部过程
# 44
# 运行t方法内部过程
# 44
上一篇:
IDEA上Java项目控制台中文乱码
