我正在使用 functools.cached_property 要像这样存储长期会话对象,请执行以下操作:
functools.cached_property
class Client: @cached_property def session(self): return service.login(...)
我只想在非常特定的情况下使缓存无效,而不想放弃缓存的方便性和清晰性 cached_property . 我怎样才能做到这一点?
cached_property
deikduxw1#
functools.cached_property 使用常规示例属性所在的位置( self.attr = ... )将被存储:对象的 .__dict__ ! 因此,您的案例的失效方法如下所示:
self.attr = ...
.__dict__
class Client: @cached_property def session(self): return service.login(...) def logout(self): self.__dict__.pop('session', None)
如果您想使所有 cached_property 如果对象具有,则可以执行以下操作:
def invalidate_cached_properties(obj): cls = type(obj) cached = { attr for attr in list(self.__dict__.keys()) if (descriptor := getattr(cls, attr, None)) if isinstance(descriptor, cached_property) } for attr in cached: del obj.__dict__[attr]
1条答案
按热度按时间deikduxw1#
functools.cached_property
使用常规示例属性所在的位置(self.attr = ...
)将被存储:对象的.__dict__
! 因此,您的案例的失效方法如下所示:如果您想使所有
cached_property
如果对象具有,则可以执行以下操作: