Я хочу иметь возможность выполнять операции с экземплярами класса, но задерживать фактические вычисления, пока другой класс не вызовет их выполнение.
Мой приведенный ниже (упрощенный) код работает. Экземпляры Foo
(здесь: f3
и f4
) рассчитываются только один раз, когда я вызываю run()
на FooStorage
, в котором хранятся все экземпляры Foo.
Вопрос: Есть ли способ достичь этого с помощью встроенного механизма, такого как декоратор, по методу __add__
?
import operator as op
MathOps = {"+":op.add, "*": op.mul}
class FooStorage():
def __init__(self):
self.foo_list = []
def add_to_foolist(self,foo):
self.foo_list.append(foo)
def run(self):
for f in self.foo_list:
f._calc()
class Foo():
def __init__(self,storage, values=None, op=None):
self._foostorage = storage
self.values = values
storage.add_to_foolist(self)
self.op = op
def __add__(self,other):
op = ("+",self,other)
return Foo(self._foostorage, op=op)
def __mul__(self, other):
pass
# to come
def _calc(self):
if self.op:
op, left, right = self.op
self.values = MathOps[op](left.values,right.values)
fs = FooStorage()
f1 = Foo(fs, values=1)
f2 = Foo(fs,values=2)
f3 = f1 + f2 # update f3 value only once fs.run() is called
f4 = f3 + f1 # update f4 value only once fs.run() is called
fs.run() # triggers calculation
f4.values