Вы можете вычислить значение веса лениво, но представить его как атрибут, используя свойства. Например:
class Edge(object):
def __init__(self, x, y):
self.x = x
self.y = y
def get_z(self):
return self.x + self.y
z = property(get_z)
e = Edge(3,4)
print e.z
Здесь e.z
представляется фактическим сохраненным значением, атрибутом объекта Edge
. Но это не так - это рассчитано по требованию. Вы все еще должны написать свой код обновления в методе get_z
, но выгода здесь в том, что вам не нужно беспокоиться об обновлении конкретного значения всякий раз, когда изменяются зависимые свойства. Вместо этого вы рассчитываете его только тогда, когда его просят.
Было бы легко расширить этот пример для кэширования значений, если вы беспокоились о множественном доступе к z
, приводящем к ненужным потенциально дорогостоящим вычислениям. Получатель проверяет таблицу соответствия перед выполнением расчета. Это просто памятка .