使“functools.cached_属性”的缓存无效

lvjbypge  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(407)

我正在使用 functools.cached_property 要像这样存储长期会话对象,请执行以下操作:

class Client:
    @cached_property
    def session(self):
        return service.login(...)

我只想在非常特定的情况下使缓存无效,而不想放弃缓存的方便性和清晰性 cached_property . 我怎样才能做到这一点?

deikduxw

deikduxw1#

functools.cached_property 使用常规示例属性所在的位置( 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]

相关问题