Как сделать объект свойства Python, который обновляется исключительно при необходимости? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть класс, который имеет комбинацию атрибутов, которые связаны друг с другом:

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

Есть ли хороший способ сделать то, что я пытаюсь сделать здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...