У меня есть класс, который имеет комбинацию атрибутов, которые связаны друг с другом:
class MyClass():
def __init__(self):
self._x = 5
@property
def y(self):
return fancy_function(self._x)
fancy_function является вычислительно дорогим. Я хотел бы иметь возможность хранить результат y где-нибудь, к которому я могу получить доступ без необходимости запускать fancy_function каждый раз, когда я делаю (что-то вроде того, что нет необходимости перекомпилировать код C ++, если зависимости обновлены). Я мог бы добавить атрибут self._y, но как я могу гарантировать, что он будет обновляться с помощью self._x? Моя лучшая идея на данный момент - написать:
class MyClass():
def __init__(self):
self._x = 5
self._last_x = self._x
self._y = fancy_function(self._x)
@property
def y(self):
if self._last_x is not self._x:
self._y = fancy_function(self._x)
return self._y
И я думаю, что это работает, но я подозреваю, что может быть более чистый способ, который не требует этого дополнительного атрибута. Кроме того, если пользователь пытается получить прямой доступ к self._y, нет гарантии, что он будет обновлен с self._x
Есть ли хороший способ сделать то, что я пытаюсь сделать здесь?