Я думаю, что это можно сделать, используя переменную для хранения уже выполненных вычислений.Я немного переработал ваш код, поэтому давайте посмотрим на него.Предположим, у вас есть следующий код:
CACHED_VALUES = {}
class SomeClass:
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2
self.pair = '{},{}'.format(num1,num2)
if self.pair not in CACHED_VALUES.keys():
print('Calculating from init...')
CACHED_VALUES[self.pair] = self.sum
else:
print('Already stored... Getting the values from cache...')
@property
def sum(self): #this can even be a class method if needed, I don't really care
return self.num1 + self.num2
t1 = SomeClass(2,3)
print(t1.sum)
t2 = SomeClass(2,3)
print(t2.sum)
print('This is new instance.')
t3 = SomeClass(2,3)
print(t3.sum)
Сначала я создал CACHED_VALUES
пустой словарь (на данный момент).Обратите внимание, что он объявлен вне класса.Во-вторых, я создал переменную self.pair
, которая представляет оба числа в виде строки, разделенной запятой.Причина этого в том, что вы не можете иметь списков как словарных ключей .Вот почему мы объединяем оба числа в строку.
Если мы применим этот подход, словарь CACHED_VALUES
будет обновлен следующим образом:
CACHED_VALUES = {}
t1 = SomeClass(2,3)
print(CACHED_VALUES)
>> {'2,3': 5}
Теперь о методе __init__
.
Я добавил условие if для проверки, содержит ли словарь CACHED_VALUES
вычисленное значение.Если нет - функция выполняется и возвращенное значение сохраняется в словаре.Если он существует - тогда мы получаем уже вычисленное значение, опуская выполнение функции.
Ниже вы можете увидеть переработанный код и его вывод:
CACHED_VALUES = {}
class SomeClass:
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2
self.pair = '{},{}'.format(num1,num2)
if self.pair not in CACHED_VALUES.keys():
print('Calculating from init...')
CACHED_VALUES[self.pair] = self.sum
else:
print('Already stored... Getting the values from cache...')
@property
def sum(self): #this can even be a class method if needed, I don't really care
return self.num1 + self.num2
print('[X]Creating first instance')
t1 = SomeClass(2,3)
print(t1.sum)
print('[X]Creating second instance')
t2 = SomeClass(2,3)
print(t2.sum)
print('[X]This is instance with different values.')
t3 = SomeClass(5,7)
print(t3.sum)
print('[X]This is second instance with different values.')
t4 = SomeClass(5,7)
print(t4.sum)
# OUTPUT:
[X]Creating first instance
Calculating from init...
5
[X]Creating second instance
Already stored... Getting the values from cache...
5
[X]This is instance with different values.
Calculating from init...
12
[X]This is second instance with same values.
Already stored... Getting the values from cache...
12