如何在特定场景下失效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
相关产品推荐
相关产品推荐

