如何在没有 DI 库的情况下将依赖项注入 Python 中的命令模式?
How to inject a dependency into Command Pattern in Python without DI lib?
我是 Python 的新手,我想暂时保持简单。这就是我要解决的问题。我在 Python 中实现了命令模式应用程序。一件事,我不确定如何“注入”Repository
class。所以它可以用于所有子 classes。这是代码。
command.py
from abc import ABC, abstractmethod
from report.repository.database import Database
class Command(ABC):
def __init__(self) -> None:
self.repository = Database() ## how do I inject this instead of init it here.
@abstractmethod
def execute(self):
pass
database.py
class Database:
def __init__(self) -> None:
self.drivers = {}
def add_driver(self, name):
self.drivers[name] = {}
add_driver.py
from report.parser.command import Command
class AddDriver(Command):
def __init__(self, name) -> None:
super().__init__()
self.name = name
def execute(self):
self.repository.add_driver(self.name)
因为我希望稍后能够在代码中使用 Database
的实例来为 drivers
生成报告。来自 Java 世界,我可以使用 Guice 注入 database
的实例。我不确定在 Python.
中最好的方法是什么
我想只在 execute
方法中注入,但我会有其他不需要 Database
的命令,我认为这是不必要的。
您可以在 database.py
中创建实例
# database.py
class Database:
def __init__(self) -> None:
self.drivers = {}
def add_driver(self, name):
self.drivers[name] = {}
db = Database()
然后在需要的地方导入它。
# command.py
from abc import ABC, abstractmethod
from report.repository.database import db
class Command(ABC):
def __init__(self) -> None:
self.repository = db
@abstractmethod
def execute(self):
pass
我是 Python 的新手,我想暂时保持简单。这就是我要解决的问题。我在 Python 中实现了命令模式应用程序。一件事,我不确定如何“注入”Repository
class。所以它可以用于所有子 classes。这是代码。
command.py
from abc import ABC, abstractmethod
from report.repository.database import Database
class Command(ABC):
def __init__(self) -> None:
self.repository = Database() ## how do I inject this instead of init it here.
@abstractmethod
def execute(self):
pass
database.py
class Database:
def __init__(self) -> None:
self.drivers = {}
def add_driver(self, name):
self.drivers[name] = {}
add_driver.py
from report.parser.command import Command
class AddDriver(Command):
def __init__(self, name) -> None:
super().__init__()
self.name = name
def execute(self):
self.repository.add_driver(self.name)
因为我希望稍后能够在代码中使用 Database
的实例来为 drivers
生成报告。来自 Java 世界,我可以使用 Guice 注入 database
的实例。我不确定在 Python.
我想只在 execute
方法中注入,但我会有其他不需要 Database
的命令,我认为这是不必要的。
您可以在 database.py
中创建实例# database.py
class Database:
def __init__(self) -> None:
self.drivers = {}
def add_driver(self, name):
self.drivers[name] = {}
db = Database()
然后在需要的地方导入它。
# command.py
from abc import ABC, abstractmethod
from report.repository.database import db
class Command(ABC):
def __init__(self) -> None:
self.repository = db
@abstractmethod
def execute(self):
pass