依赖注入(Dependency Injection,简称DI)是一种编程技术,用于解耦,减少代码的依赖关系,提高代码的可复用性和可测试性。 在实现依赖注入时,有多种不同的方法,下面介绍两种比较常用的方法。
构造函数注入
构造函数注入是一种比较简单和直接的方式,即在类的构造函数中注入依赖的对象。示例代码如下:
class Test:
def __init__(self, dependency):
self.dependency = dependency
def do_something(self):
self.dependency.do_something_else()
在这里,Test类的构造函数接收一个依赖,然后将其存储到实例属性中。在do_something方法中,我们可以使用依赖对象的方法来执行任务。假设我们有这样一个依赖:
class Dependency:
def do_something_else(self):
print("doing something else")
我们可以使用构造函数注入的方式将其注入到Test类中:
d = Dependency()
t = Test(d)
t.do_something() # 输出 "doing something else"
属性注入
属性注入是将依赖的对象注入到类的实例属性中,示例代码如下:
class Test:
def __init__(self):
pass
def do_something(self):
self.dependency.do_something_else()
@property
def dependency(self):
return self._dependency
@dependency.setter
def dependency(self, value):
self._dependency = value
在这里,我们定义一个实例属性_dependency,使用@property和@dependency.setter装饰器将其声明为可读写的属性。当我们需要使用依赖对象时,调用do_something方法即可。
为了注入依赖对象,我们可以简单地将其实例化并将其赋值给实例属性_dependency:
d = Dependency()
t = Test()
t.dependency = d
t.do_something() # 输出 "doing something else"
总结
无论使用哪种方式实现依赖注入,其目的都是为了解耦和增强代码的可测试性和可复用性。构造函数注入和属性注入是最常见的方法,但还有其他更高级的方法,例如装饰器注入和服务定位器模式。在选择依赖注入方式时,需要根据具体的场景和要求做出选择。