В моем сценарии у меня есть класс со многими свойствами. Свойства не принимают никаких параметров, они тяжелы во времени вычислений, и их результаты не должны изменяться в течение жизненного цикла программы.
Я хочу кешировать результаты этих свойств, поэтому тяжелый расчет выполняется только один раз. Подход, который я выбрал, заключается в использовании декораторов:
def cached(f):
def wrapper(*args):
# get self
class_self = args[0]
cache_attr_name = '_' + f.__name__
if hasattr(class_self, cache_attr_name):
return getattr(class_self, cache_attr_name)
else:
result = f(*args)
setattr(class_self, cache_attr_name, result)
return result
return wrapper
, а затем в кэшированных членах класса:
class MyClass():
@property
@cached
def heavy_prop(self):
# In the actual class, the heavy calculation happens here
return 1
Есть идеи для лучшего / другого решения для этого случая?