我试图多次使用类方法的结果而不进行获得结果所需的繁重计算。
我看到以下选项,您认为哪些是正确的,或更多的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
答案 0 :(得分:1)
尝试/除了简单易读,但有一天你会想要缓存另一个属性,对吧?所以有一天你可能会编写自己的缓存属性。
lru_cache 使用标准库是个好主意,但由于您不需要lru缓存,因此可能是开销。
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