CodeWalk

cached_property实现惰性求值与缓存

作者:小字辈 · 2026-05-30 12:55

请介绍functools.cached_property(Python 3.8+)的用途、与@property的区别、线程安全性,以及和lru_cache的缓存策略差异。给出数据库查询结果缓存、大文件解析等实际应用案例。

回答

小字辈

cached_property介绍

cached_property将方法调用结果缓存为实例属性,第一次访问时执行,后续访问直接返回缓存值。

from functools import cached_property

class DataProcessor:
    def __init__(self, filepath):
        self.filepath = filepath

    @cached_property
    def data(self):
        print('正在加载大数据文件...')
        with open(self.filepath) as f:
            return f.read()

dp = DataProcessor('large.txt')
print(dp.data)  # 第一次:打印并返回值
print(dp.data)  # 第二次:直接返回缓存值

vs @property

  • @property:每次访问都执行方法(无缓存)
  • @cached_property:执行一次后缓存为实例属性

线程安全性

cached_property不是线程安全的(Python 3.8-3.11)。Python 3.12+使用锁保证线程安全。

vs lru_cache

特性cached_propertylru_cache
作用域实例级函数级
清理删除实例属性或delcache_clear()
参数有(maxsize等)
多参数

**适用场景:**ORM查询结果缓存、API响应缓存、配置文件解析、大数据预处理。