【发布时间】:2011-03-02 01:02:35
【问题描述】:
最近我浏览了一个包含许多类的现有代码库,其中实例属性反映了存储在数据库中的值。我已经重构了很多这些属性,以推迟它们的数据库查找,即。不在构造函数中初始化,而仅在第一次读取时初始化。这些属性在实例的生命周期内不会改变,但它们是第一次计算的真正瓶颈,并且仅在特殊情况下才真正访问。因此,它们也可以在从数据库中检索到之后被缓存(因此这符合 memoisation 的定义,其中输入只是“无输入”)。
我发现自己一遍又一遍地为各种类的各种属性输入以下 sn-p 代码:
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
是否有一个现有的装饰器可以在 Python 中执行此操作,而我根本不知道?或者,是否有一种相当简单的方法来定义一个这样做的装饰器?
我在 Python 2.5 下工作,但如果 2.6 的答案有很大不同,它们可能仍然很有趣。
注意
这个问题是在 Python 包含很多现成的装饰器之前被问到的。我只更新了它以更正术语。
【问题讨论】:
-
我使用的是 Python 2.7,我没有看到任何关于现成装饰器的信息。您能否提供问题中提到的现成装饰器的链接?
-
@Bamcclur 抱歉,以前有其他 cmets 详细介绍它们,不知道为什么它们被删除。我现在唯一能找到的是 Python 3:
functools.lru_cache()。 -
不确定是否有内置插件(至少 Python 2.7),但有 Boltons 库的 cachedproperty
-
@guyarad 我直到现在才看到这条评论。那是一个很棒的图书馆!将其发布为答案,以便我投票。