@reify 每次调用都执行数据库查询?
@reify executes database queries every time called?
基于this comment关于具体化,
It acts like @property, except that the function is only ever called once; after that, the value is cached as a regular attribute. This gives you lazy attribute creation on objects that are meant to be immutable.
我有这个自定义具体化 class:
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
它的用法如下:
@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")
。
这按预期工作,但不确定这是缓存结果还是每次调用时都执行查询,我如何确认?我的意思是这个实现是否正确? (没有数据库控制台)
像 def user_details(self, user_id)
这样的签名有太多参数,@reify
甚至 @property
都无法支持。应该是def user_details(self)
。然后 reify
装饰器会将属性 self.user_details
修改为 return 在实例持续时间内的相同值。请注意,它不是全局的,而是每个实例的,因为它使用 self
。要确认它正在缓存,您只需将打印语句放在 user_details
函数中以确认它在每个实例中仅被调用一次。
基于this comment关于具体化,
It acts like @property, except that the function is only ever called once; after that, the value is cached as a regular attribute. This gives you lazy attribute creation on objects that are meant to be immutable.
我有这个自定义具体化 class:
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
它的用法如下:
@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")
。
这按预期工作,但不确定这是缓存结果还是每次调用时都执行查询,我如何确认?我的意思是这个实现是否正确? (没有数据库控制台)
像 def user_details(self, user_id)
这样的签名有太多参数,@reify
甚至 @property
都无法支持。应该是def user_details(self)
。然后 reify
装饰器会将属性 self.user_details
修改为 return 在实例持续时间内的相同值。请注意,它不是全局的,而是每个实例的,因为它使用 self
。要确认它正在缓存,您只需将打印语句放在 user_details
函数中以确认它在每个实例中仅被调用一次。