当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python functools.cached_property用法及代码示例


用法:

@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.org大神的英文原创作品 functools.cached_property。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。