最近,我在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`.
当然可以,但是如果有许多不同的地方使用
monopoly.boardwalk
,那会怎样呢?现在您必须确保所有这些位置都在本地缓存该值。或者,您可以让Monopoly
类负责缓存。在cached_property
使类更容易负责,而不是属性的使用者。在如果您正在努力寻找在许多不同地方使用的东西的例子:在一个大小适中的Django应用程序中,模板、视图和后端代码都有可能接触到给定的模型。其中一些位置在Django框架本身(如管理接口)中,当您向模型中添加一个昂贵的操作时更新所有这些位置是不实际的。使用decorator很实用;将责任放在模型中可以使所有其他代码更简单。在
相关问题 更多 >
编程相关推荐