I'm trying to use the result of a class method several times without doing the heavy calculations required to obtain the result.
I am seeing the following options. Which ones do you think is the right one, or more pythonic?
What are the advantages and disadvantages of each one?
Try/Except approach
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 approach
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's cache_property approach
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