使用缓存的属性构造在python中缓存属性

使用缓存的属性构造在python中缓存属性,python,caching,properties,Python,Caching,Properties,最近,我在一些python第三方软件包的代码库中看到了cached_属性decorator的使用,如芹菜和django(它也是django中的一个实用函数)和瓶子web框架。还有一个独立的软件包可供使用。 据我所知,它通过提供缓存行为来避免繁重的计算 以下是实现以下功能的源代码: 这就是它的使用方式: class Monopoly(object): def __init__(self): self.boardwalk_price = 500 @cached_p

最近,我在一些python第三方软件包的代码库中看到了
cached_属性
decorator的使用,如芹菜和django(它也是django中的一个实用函数)和瓶子web框架。还有一个独立的软件包可供使用。 据我所知,它通过提供缓存行为来避免繁重的计算

以下是实现以下功能的源代码:

这就是它的使用方式:

class Monopoly(object):

    def __init__(self):
        self.boardwalk_price = 500

    @cached_property
    def boardwalk(self):
        # Again, this is a silly example. Don't worry about it, this is
        #   just an example for clarity.
        self.boardwalk_price += 50
        return self.boardwalk_price
现在,当我们运行它的价格保持在550美元

>>> monopoly = Monopoly()
>>> monopoly.boardwalk
550
>>> monopoly.boardwalk
550
>>> monopoly.boardwalk
550
我们不能简单地存储第一次调用属性/属性的结果,然后在以后使用它来避免重新计算吗?我相信这是一个非常愚蠢的问题,但我在这里遗漏了什么

例:


当然可以,但是如果有许多不同的地方使用垄断。木板路怎么办?现在,您必须确保所有这些位置都在本地缓存该值。或者您可以让
垄断
类负责缓存

cached_属性
使类更容易负责,而不是属性的使用者


如果您正在努力寻找在许多不同地方使用的示例:在一个大小适中的Django应用程序中,您将拥有模板、视图和后端代码,所有这些都可能涉及给定的模型。其中一些地方在Django框架本身(比如管理界面)中,当您向模型中添加昂贵的操作时,更新所有这些地方是不实际的。使用装饰器是可行的;将责任放在模型上可以简化所有其他代码。

@MartijnPieters非常感谢我得到了它:)。但为什么问题没有理由就被否决了呢?我在这里问的时候遗漏了什么吗?对不起,我不能读心术;投票是匿名的是有原因的。我们所能做的就是指向下一票按钮上的工具提示:这个问题没有显示任何研究成果;不清楚或没有用处;选民可能觉得在你调查的问题中没有任何迹象。再说一次,我看不懂人的心思,甚至看不出谁投了票。
>>> monopoly = Monopoly()
>>> monopoly.boardwalk
550
>>> monopoly.boardwalk
550
>>> monopoly.boardwalk
550
monopoly = Monopoly()
>>> stored_value = monopoly.boardwalk
550

# now use stored_value instead of making a call to `monopoly.boardwalk`.