使用缓存的_property constru在python中缓存属性

2024-09-29 21:51:12 发布

您现在位置:Python中文网/ 问答频道 /正文

最近,我在python第三方包的一些代码库中看到了cached_properties修饰符的使用,比如celery和django(它也是django中的一个实用函数)和bottleweb框架。还有一个独立的包用于使用cached_properties。 据我所知,这是关于通过提供缓存行为来避免繁重的计算。在

下面是实现cached_property的源代码:

class cached_property(object):
    """
    A property that is only computed once per instance and then replaces itself
    with an ordinary attribute. Deleting the attribute resets the property."""

    def __init__(self, func):
        self.__doc__ = getattr(func, '__doc__')
        self.func = func

    def __get__(self, obj, cls):
        if obj is None:
            return self
        value = obj.__dict__[self.func.__name__] = self.func(obj)
        return value

它的用法如下:

^{pr2}$

现在,当我们运行它的价格保持在550美元。在

>>> 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`.

Tags: thedjangoselfobjdocisvaluedef
1条回答
网友
1楼 · 发布于 2024-09-29 21:51:12

当然可以,但是如果有许多不同的地方使用monopoly.boardwalk,那会怎样呢?现在您必须确保所有这些位置都在本地缓存该值。或者,您可以让Monopoly类负责缓存。在

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

如果您正在努力寻找在许多不同地方使用的东西的例子:在一个大小适中的Django应用程序中,模板、视图和后端代码都有可能接触到给定的模型。其中一些位置在Django框架本身(如管理接口)中,当您向模型中添加一个昂贵的操作时更新所有这些位置是不实际的。使用decorator很实用;将责任放在模型中可以使所有其他代码更简单。在

相关问题 更多 >

    热门问题