Ленивый расчет для класса - PullRequest
0 голосов
/ 01 мая 2020

Я хочу иметь возможность выполнять операции с экземплярами класса, но задерживать фактические вычисления, пока другой класс не вызовет их выполнение.

Мой приведенный ниже (упрощенный) код работает. Экземпляры 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

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