#python #dependency-injection #singleton
Вопрос:
Я использую модуль инжектора в Python для создания одноэлементных объектов и автоматического внедрения их в другие классы. Таким образом, инициализация обрабатывается автоматически, и создается только один экземпляр каждого класса, поэтому информация передается между объектами очень легко, поскольку все они ссылаются и используют один и тот же экземпляр каждого объекта.
По какой-то причине я хочу инициализировать некоторые классы не на этапе инициализации других классов, а позже во время выполнения моей программы. Однако я хотел бы по-прежнему использовать свойство singleton и инициализировать эти дополнительные классы теми же объектами, которые также используют другие классы.
В приведенной выше ссылке на документацию модуля говорится, что глобального объекта или состояния инжектора не существует.
Приведенный ниже код — это фиктивный пример, который я сделал, представляя проблему:
from injector import singleton, inject, Injector
@singleton
class Factor:
def __init__(self) -> None:
self.multiplier: float = 2.0
def change_multiplier(self):
self.multiplier = 4.0
return self.multiplier
@singleton
class Fudge:
@inject
def __init__(self, factor: Factor) -> None:
self.factor = factor
self.fudge: float = self.factor.change_multiplier()
@singleton
class Multiplier1:
@inject
def __init__(self, fudge: Fudge, factor: Factor) -> None:
self.result = None
self.x: float = 2.0
self.y: float = 3.0
self.fudge = fudge
self.factor = factor
def run(self):
self.result = (self.x self.y) * self.factor.multiplier
return self.result
@singleton
class Multiplier2:
@inject
def __init__(self, factor: Factor) -> None:
self.result = None
self.x: float = 2.0
self.y: float = 3.0
self.factor = factor
def run(self):
self.result = (self.x self.y) * self.factor.multiplier
return self.result
injector1 = Injector()
injector2 = Injector()
app1 = injector1.get(Multiplier1)
app2 = injector2.get(Multiplier2)
print(f"Result of app1 {app1.run()}")
print(f"Result of app2 {app2.run()}")
Результат:
Result of app1 20.0
Result of app2 10.0
Инициализация класса Fudge напрямую влияет на результат multiplier1
, поскольку они ссылаются на один и тот же экземпляр factor
класса.
Однако, когда multiplier2
позже создается с помощью другого инжектора, он ссылается на другой factor
объект.
Как мы можем сделать классы глобальными одиночными?