Python - 只计算一次属性并多次使用结果(不同的方法)

时间:2017-07-13 20:12:20

标签: python properties class-method

我试图多次使用类方法的结果而不进行获得结果所需的繁重计算。

我看到以下选项,您认为哪些是正确的,或更多的pythonic?

每个人的优点和缺点是什么?

尝试/接受方法:

class Test:
    def __init__(self, *args):
        # do stuff

    @property
    def new_method(self):
        try:
            return self._new_property
        except AttributeError:
            # do some heavy calculations
            return self._new_property

lru_cache方法:

from functools import lru_cache

class Test:
    def __init__(self, *args):
        # do stuff

    @property
    @lru_cache()
    def new_method(self):
        # do some heavy calculations
        return self._new_property

Django的cache_property方法:

from django.utils.functional import cached_property

class Test:
    def __init__(self, *args):
        # do stuff

    @cached_property
    def new_method(self):
        # do some heavy calculations
        return self._new_property

2 个答案:

答案 0 :(得分:1)

  1. 尝试/除了简单易读,但有一天你会想要缓存另一个属性,对吧?所以有一天你可能会编写自己的缓存属性。

  2. lru_cache 使用标准库是个好主意,但由于您不需要lru缓存,因此可能是开销。

  3. Django的cache_property 完全按照您的意愿工作,非常简单。它在werkzeug中具有类似性(因此Flask用户也熟悉它),很容易找到来源,所以它可能是你的不错选择。

答案 1 :(得分:1)

Python 3.8更新:您现在可以使用functools.cached_property

from functools import cached_property

class Test:
    def __init__(self, *args):
        # do stuff

    @cached_property
    def new_method(self):
        # do some heavy calculations
        return self._new_property