Один из способов решить все ваши проблемы - создать фабрику, которая будет создавать востребованные синглтоны.
С помощью этих двух шаблонов проектирования вы можете создавать экземпляры класса и создавать переменные только при необходимости (фабрика), и вы можете повторно использовать их, не вычисляя их снова в нескольких модулях (singleton)
Edit 1
Вот практическое приложение с примером псевдокода.
В моем скрипте мне нужна переменная для того, чтобы что-то накапливать. Эти переменные: число с определенным числом с плавающей запятой, число Фибоначчи с несколькими числами и простое число.
Я создаю скрипт с функциями для вычисления каждой необходимой мне переменной, но у каждой функции есть кеш, который будет захватыватьвычисленное значение.
#compute_variables.py
def pi(n):
pass
def fibonaci(n):
pass
def prime_number(n):
pass
Все эти функции требуют интенсивных вычислений и должны быть вычислены только один раз для каждой переменной.
Теперь мне нужен класс, который будет возвращать нужные вычисления vaibales, уже вычисленные в синглтоне (каждый раз возвращается только один объект)
#variables.py
class Calculus1:
def __new__(cls):
#singleton logic
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def var1(self):
return pi(self.a)
def var2(self):
return fibonaci(self.b)
def var3(self):
return prime_number(self.c)
class Calculus2:
def __new__(cls):
#singleton logic
def __init__(self, a, b, e):
self.a = a
self.b = b
self.e = e
def var1(self):
return pi(self.a)
def var2(self):
return fibonaci(self.b)
def var3(self):
return prime_number(self.e)
У меня есть медвежья кость, я знаю, что мне нужна фабрика, которая возвращает синглтон переменных класса.
# factory_meth.py
def factory(var_class_name):
# Factory logic here
myVars = CalculusX(x, y, z)
return myVars
И наконец, я использовал всю эту реализациюв моем приложении.
from factory_meth import factory
def fancy_something_1(f, g):
vars = factory("Calculus2")
return (f * vars.vars1 / (vars.vars2 + vars.vars3))**g
def fancy_something_2(z ,h):
vars = factory("Calculus2")
return z + vars.vars1 vars.vars2 + vars.vars3 + h
С этой логикой все переменные будут вызываться и вычисляться только тогда, когда это необходимо (фабрика), где, даже если переменная вызывается, не будет вычислений, поскольку ее тот же объект возвращает(Singleton).
Примечание
Вышеприведенная архитектура является одним из способов достижения отложенной нагрузки и вызова по требованию, но дизайн может быть изменен в соответствии с вашими потребностями.