首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@reify每次调用时都执行数据库查询?

@reify每次调用时都执行数据库查询?
EN

Stack Overflow用户
提问于 2021-05-31 22:45:28
回答 1查看 65关注 0票数 3

基于this comment关于reify,

它的作用类似于@property,只是函数只被调用一次;在此之后,值被缓存为一个常规属性。这使您可以对对象创建惰性属性,这些对象应该是不可变的。

我有一个定制的具体化类:

代码语言:javascript
复制
class reify(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped

    def __get__(self, inst):
        if inst is None:
            return self
        val = self.wrapped(inst)
        setattr(inst, self.wrapped.__name__, val)
        return val

它的用途就像:

代码语言:javascript
复制
@reify
def user_details(self, user_id):
    try:
        # function that executes db query, returns dict
        return user_details_from_id(self._dbconn, user_id)
    except Exception as e:
        pass

显然,我们可以使用它只做name = self.user_details.get("name")

这可以正常工作,但不确定这是缓存结果还是每次调用时执行查询,我如何确认?我的意思是这个实现是正确的吗?(没有DB控制台)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-07 14:30:42

def user_details(self, user_id)这样的签名有太多的arg不能被@reify甚至@property所支持。应该是def user_details(self)。然后,reify装饰器将修改属性self.user_details,以在实例持续时间内返回相同的值。注意,它不是全局的,而是每个实例的,因为它使用self。要确认它是缓存,只需将print语句放在user_details函数中,以确认每个实例只调用一次。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67780893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档