Python 依赖注入(DI)三种实现方式与可测试性实践
概述
依赖注入(Dependency Injection,简称 DI)是解决大型项目中依赖关系混乱、代码难以测试和维护的关键模式。它将对象的创建与使用分离,使代码更松耦合、更易扩展。结合类型提示(typing + mypy)和现代框架,Python 能优雅承载所有 DI 模式。
基础概念
依赖注入的实现离不开 Python 核心语法与面向对象机制。
- 核心语法与数据类型:列表、字典、集合、元组是构建依赖容器的基础;条件语句、循环和异常处理确保注入逻辑健壮。
config = {"db_url": "sqlite:///test.db", "timeout": 30}
items = [1, 2, 3]
- 函数与面向对象编程:函数定义、参数传递、匿名函数(lambda)和装饰器是 DI 的基础工具。类通过构造方法接收依赖,实现封装与多态。
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 花费时间:{end - start:.4f}秒")
return result
return wrapper
@timer
def compute_sum(n):
return sum(range(n))
print(compute_sum(1000000))
主流实现方式
Python 提供三种主流 DI 方式,每种都对应不同复杂度场景。
1. 显式传参(Constructor Injection / Function Injection)
最简单、最推荐的纯 Python 方式:直接在构造方法或函数参数中传入依赖。
class :
():
.db = db
.email_sender = email_sender
():
.db.save_transaction(order_id, amount)
.email_sender.send_confirmation(order_id)


