pinject依赖注入模块
pinject 是一个基于 Python 的轻量级依赖注入库,可以方便地实现依赖注入的功能。
下面我们将通过一个简单的示例来演示如何使用 pinject 实现依赖注入。
首先,我们需要安装 pinject 库:
pip install pinject
接下来,我们创建两个类:一个名为 EmailSender 的邮件发送器类,另一个名为 NewsletterManager 的新闻通讯管理器类。
其中,NewsletterManager 类依赖于 EmailSender 类,因为它需要调用 EmailSender.send_email() 方法来发送邮件。
python
class EmailSender:
def send_email(self, to_addr: str, subject: str, body: str):
print(f"Sending email to {to_addr}\nSubject: {subject}\nBody: {body}")
class NewsletterManager:
def __init__(self, email_sender: EmailSender):
self.email_sender = email_sender
def send_newsletter(self, recipients: List[str], subject: str, body: str):
for recipient in recipients:
self.email_sender.send_email(recipient, subject, body)
然后,我们使用 pinject 注册这两个类,并使用 inject 装饰器来实现依赖注入。
inject 装饰器将自动检测所有参数类型,并尝试为其注入合适的实例。
import pinject
class AppModule(pinject.BindingSpec):
@pinject.provider
def provide_email_sender(self) -> EmailSender:
return EmailSender()
@pinject.provider
def provide_newsletter_manager(self, email_sender: EmailSender) -> NewsletterManager:
return NewsletterManager(email_sender)
class App:
@pinject.inject
def __init__(self, newsletter_manager: NewsletterManager):
self.newsletter_manager = newsletter_manager
if __name__ == '__main__':
obj_graph = pinject.new_object_graph(binding_specs=[AppModule])
app = obj_graph.provide(App)
recipients = ['alice@example.com', 'bob@example.com']
app.newsletter_manager.send_newsletter(recipients, 'Newsletter', 'Hello from our company!')
在这个示例中,我们定义了名为 AppModule 的类,
并使用 pinject.provider 装饰器定义了两个提供者方法:provide_email_sender() 和 provide_newsletter_manager()。
provide_email_sender() 方法返回一个新的 EmailSender 实例;provide_newsletter_manager() 方法接受一个 EmailSender 参数并返回一个新的 NewsletterManager 实例。
然后,我们定义了一个名为 App 的类,并使用 pinject.inject 装饰器将其构造函数标记为可注入的。
在 App 类的构造函数中,我们注入了一个 NewsletterManager 实例,并将其存储在 self.newsletter_manager 属性中。
在主程序中,我们首先创建了一个 AppModule 实例,并通过 new_object_graph() 方法创建了一个新的对象图。
然后,我们调用 obj_graph.provide() 方法来创建一个新的 App 实例,并将其存储在 app 变量中。
最后,我们调用 app.newsletter_manager.send_newsletter() 方法来发送新闻通讯邮件。
在这个示例中,pinject 自动检测到 NewsletterManager 的构造函数需要一个 EmailSender 实例,
并使用 provide_email_sender() 方法提供了一个合适的实例。这样,我们就实现了依赖注入的功能。
pinject依赖注入模块的更多相关文章
- [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)
[.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提供的:单一对象生成.生命周期 ...
- 如何在.NET Core控制台程序中使用依赖注入
背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...
- Spring.Net依赖注入(属性注入)
一.前言: Spring.Net是Java开源框架迁移过来的,主要分为 1)依赖注入 2)面向方面编程 3)数据访问抽象 4)Asp.Net扩展 四个模块功能,这里只是简单介绍依赖注入模块功能. 对于 ...
- Spring.Net依赖注入(属性注入)学习笔记
一.前言: Spring.Net是Java开源框架迁移过来的,主要分为 1)依赖注入 2)面向方面编程 3)数据访问抽象 4)Asp.Net扩展 四个模块功能,这里只是简单介绍依赖注入模块功能. 对于 ...
- angular路由 模块 依赖注入
1.模块 var helloModule=angular.module('helloAngular',[]); helloModule.controller('helloNgCrtl',['$scop ...
- 4.了解AngularJS模块和依赖注入
1.模块和依赖注入概述 1.了解模块 AngularJS模块是一种容器,把代码隔离并组织成简洁,整齐,可复用的块. 模块本身不提供直接的功能:包含其他提供功能的对象的实例:控制器,过滤器,服务,动画 ...
- --@angularJS--路由、模块、依赖注入
以下是演示angular路由切换的demo. 主页:index.html <!doctype html><html ng-app="bookStoreApp"&g ...
- 基于ABP模块组件与依赖注入组件的项目插件开发
注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础. 模块系统:http://www.cnblogs.com/mienreal/p/4537522.html 依赖注入:http://w ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用
再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...
随机推荐
- [转帖]【测试】 FIO:ceph/磁盘IO测试工具 fio(iodepth深度)
目录 随看随用 NAS文件系统测试 块系统测试 FIO用法 FIO介绍 FIO 工具常用参数: FIO结果说明 I/O 的重放('录'下实际工况的IO,用fio'重放') fio工作参数可以写入配置文 ...
- Firewall-cmd 启用NAT开放内网机器通过能上网的机器访问外网的方法
Firewall-cmd 启用NAT开放内网机器通过能上网的机器访问外网的方法 背景说明 昨天的处置已经可以让外部可以使用唯一的电信IP地址访问内部交换机的服务器了. 但是今天的场景是想让内网交换机的 ...
- [转帖]如何理解 iowait
Linux中,%iowait 过高可能是个问题,严重的时候,它能使服务停止, 但问题是,多高才算高? 什么时候应该担心呢? 本文将讨论 iowait 的含义.相关的统计数据.原理以及 iowait的瓶 ...
- React中兄弟组件通信和组件跨级传递Context的使用
React兄弟组件之间的通信 Child2组件需要去更改Child1组件中的数据. 因为Child1和Child2是兄弟组件 所以数据和事件都放在最进的父级组件中去 兄弟组件通信的简单使用 impor ...
- js 删除数组中的某一个内容
<script type="text/javascript"> let list=["为","啊发大水","阿斯蒂芬& ...
- 从零开始配置vim(26)——LSP UI 美化
之前我们通过几个实例演示如何配置其他语言的lsp服务,相信各位小伙伴碰到其他的编程语言也能熟练的配置它对应的lsp服务.本篇讲作为一个补充,我们来优化一下LSP 相关的显示 配置 UI 原始的 lsp ...
- 【3】Pycharm超详细基础设置,autopep8 安装规范化程序,每个小trick都可以快速提升变成效率,超级实用!
相关文章: [1]Pycharm 主题设置推荐Material Theme UI以及编辑环境配置(字体大小和颜色) [2]Pycharm插件推荐,超级实用!每个小trick都可以快速提升变成效率! [ ...
- M2版Mac mini被京东杀到史低2888元!比苹果官网低1600
苹果跳水王M2版Mac mini又降价了. 根据京东官方百亿补贴频道显示,Mac mini 8+256GB入门版只要2888元了,比前不久的拼多多2959还低,刷新了这款电脑的史上最低价. 对比官网原 ...
- Ubuntu 23.04 正式发布
Ubuntu 23.04 "Lunar Lobster" 是 Ubuntu 操作系统的最新短期支持版本,该版本将获得 9 个月的支持,直到 2024 年 1 月.如果你需要长期支持 ...
- 错误:tensorflow.python.framework.errors_impl.InvalidArgumentError: ValueError: attempt to get argmax of an empty sequence的解决方案
近日,在使用Cascade R-CNN完成目标检测任务时,我在使用这个模型训练自己的数据集时出现了如下错误: 具体如以下截图所示: 详细错误如下所示: Traceback (most recent c ...