最近,我浏览了一个包含许多类的现有代码库,其中实例属性反映了存储在数据库中的值.我重构了很多这些属性,以便延迟数据库查找,即.不是在构造函数中初始化,而是仅在第一次读取时初始化.这些属性在实例的生命周期内不会发生变化,但它们是第一次计算的真正瓶颈,并且只在特殊情况下才真正访问过.因此,它们也可以在从数据库中检索后进行缓存(这因此符合记忆的定义,其中输入只是"无输入").
我发现自己一遍又一遍地为各种类的各种属性输入以下代码片段:
class testA(object):
def __init__(self):
self._a = None
self._b = None
@property
def a(self):
if self._a is None:
# Calculate the attribute now
self._a = 7
return self._a
@property
def b(self):
#etc
Run Code Online (Sandbox Code Playgroud)
是否有现成的装饰器已经在Python中执行此操作,我根本不知道?或者,是否有一种相当简单的方法来定义装饰器来执行此操作?
我在Python 2.5下工作,但如果它们有显着差异,2.6答案可能仍然很有趣.
在Python包含了大量现成的装饰器之前,人们已经提出了这个问题.我更新了它只是为了更正术语.