如何在没有 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