You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在特定场景下失效functools.cached_property的缓存?

如何在特定场景下失效cached_property的缓存

这个需求其实很好实现,而且完全不用放弃cached_property带来的便捷性和清晰性!

核心原理

functools.cached_property的缓存逻辑非常直白:它会把第一次执行方法得到的结果,存储在实例的__dict__字典中,键就是你定义的属性名(比如这里的session)。当你再次访问这个属性时,它会先检查__dict__里有没有对应的键,有就直接返回缓存值,没有才会重新执行方法并缓存新结果。

所以,要让缓存失效,只需要从实例的__dict__中删除对应的键即可。

具体实现

给你的Client类添加一个专门的方法来失效session缓存:

from functools import cached_property

class Client:
    @cached_property
    def session(self):
        return service.login(...)
    
    def invalidate_session(self):
        # 用pop方法删除缓存,第二个参数None避免键不存在时报错
        self.__dict__.pop('session', None)

之后,当你需要在特定场景下刷新会话时,只需要调用这个方法:

client = Client()
# 第一次访问会创建会话并缓存
print(client.session)
# 特定场景下失效缓存
client.invalidate_session()
# 再次访问会重新调用login获取新会话
print(client.session)

进阶:通用失效方法

如果你有多个cached_property都需要支持失效,可以写一个通用方法来处理任意缓存属性:

class Client:
    @cached_property
    def session(self):
        return service.login(...)
    
    @cached_property
    def user_profile(self):
        return fetch_user_profile(...)
    
    def invalidate_cached_property(self, prop_name):
        """失效指定的cached_property缓存"""
        self.__dict__.pop(prop_name, None)

使用时就可以灵活指定要失效的属性:

# 失效session缓存
client.invalidate_cached_property('session')
# 失效user_profile缓存
client.invalidate_cached_property('user_profile')

这种方式既保留了cached_property的简洁性,又能完全满足你在特定场景下手动失效缓存的需求,完全不需要额外的复杂封装~

内容的提问来源于stack exchange,提问作者flying sheep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:53:12