用法:
@functools.cached_property(func)
将类的方法转换为属性,其值被计算一次,然后在实例的生命周期内作为普通属性缓存。类似于
property()
,但增加了缓存。对于实例的昂贵计算属性很有用,否则这些属性实际上是不可变的。例子:
class DataSet: def __init__(self, sequence_of_numbers): self._data = tuple(sequence_of_numbers) @cached_property def stdev(self): return statistics.stdev(self._data)
cached_property()
的机制与property()
有所不同。除非定义了 setter,否则常规属性会阻止属性写入。相反,cached_property
允许写入。cached_property
装饰器仅在查找时运行,并且仅在不存在同名属性时运行。当它运行时,cached_property
会写入具有相同名称的属性。随后的属性读取和写入优先于cached_property
方法,它的工作方式与普通属性一样。可以通过删除属性来清除缓存的值。这允许
cached_property
方法再次运行。注意,这个装饰器会干扰PEP 412key-sharing 字典。这意味着实例字典可以占用比平时更多的空间。
此外,此装饰器要求每个实例上的
__dict__
属性是可变映射。这意味着它不适用于某些类型,例如元类(因为类型实例上的__dict__
属性是类命名空间的只读代理),以及那些指定__slots__
而不包括__dict__
作为其中之一的类型定义的槽(因为这样的类根本不提供__dict__
属性)。如果可变映射不可用或需要节省空间的 key 共享,则可以通过在
cache()
之上堆叠property()
来实现类似于cached_property()
的效果:class DataSet: def __init__(self, sequence_of_numbers): self._data = sequence_of_numbers @property @cache def stdev(self): return statistics.stdev(self._data)
3.8 版中的新函数。
相关用法
- Python functools.cache用法及代码示例
- Python functools.wraps用法及代码示例
- Python functools.singledispatchmethod用法及代码示例
- Python functools.singledispatch用法及代码示例
- Python functools.partial用法及代码示例
- Python functools.partialmethod用法及代码示例
- Python functools.lru_cache用法及代码示例
- Python functools.reduce用法及代码示例
- Python functools.total_ordering用法及代码示例
- Python functools.wraps()用法及代码示例
- Python dict fromkeys()用法及代码示例
- Python frexp()用法及代码示例
- Python float转exponential用法及代码示例
- Python calendar firstweekday()用法及代码示例
- Python fsum()用法及代码示例
- Python float.is_integer用法及代码示例
- Python format()用法及代码示例
- Python calendar formatmonth()用法及代码示例
- Python filecmp.cmpfiles()用法及代码示例
注:本文由纯净天空筛选整理自python.org大神的英文原创作品 functools.cached_property。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。