當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。