考虑以下:
@property def name(self): if not hasattr(self, '_name'): # expensive calculation self._name = 1 + 1 return self._name
我是新手,但我认为缓存可以分解为装饰器。只是我没有找到喜欢的;)
PS真正的计算不依赖于可变值
Python 3.8functools.cached_property装饰器
functools.cached_property
https://docs.python.org/dev/library/functools.html#functools.cached_property
这个装饰器可以被看作是缓存,或者当你没有任何参数时@property作为一个清洁器 。@functools.lru_cache
@property
@functools.lru_cache
文档说:
@functools.cached_property(func) 将类的方法转换为属性,其值被计算一次,然后在实例的生命周期内作为普通属性缓存。与 property() 类似,但增加了缓存。对于实例的昂贵计算属性很有用,否则这些属性实际上是不可变的。 例子: class DataSet: def __init__(self, sequence_of_numbers): self._data = sequence_of_numbers @cached_property def stdev(self): return statistics.stdev(self._data) @cached_property def variance(self): return statistics.variance(self._data) 3.8 版中的新功能。 注意此装饰器要求每个实例上的 dict 属性是可变映射。这意味着它不适用于某些类型,例如元类(因为类型实例上的 dict 属性是类名称空间的只读代理),以及那些指定 插槽 而不包括 dict 作为已定义插槽之一的类型(如此类根本不提供 dict 属性)。
@functools.cached_property(func)
将类的方法转换为属性,其值被计算一次,然后在实例的生命周期内作为普通属性缓存。与 property() 类似,但增加了缓存。对于实例的昂贵计算属性很有用,否则这些属性实际上是不可变的。
例子:
class DataSet: def __init__(self, sequence_of_numbers): self._data = sequence_of_numbers @cached_property def stdev(self): return statistics.stdev(self._data) @cached_property def variance(self): return statistics.variance(self._data)
3.8 版中的新功能。
注意此装饰器要求每个实例上的 dict 属性是可变映射。这意味着它不适用于某些类型,例如元类(因为类型实例上的 dict 属性是类名称空间的只读代理),以及那些指定 插槽 而不包括 dict 作为已定义插槽之一的类型(如此类根本不提供 dict 属性)。