这一切都取决于情况.例如,如果您使用依赖注入来进行测试,所以您可以轻松地嘲笑某些内容 – 您可以经常放弃注入:您可以嘲笑您将注入的模块或类:

subprocess.Popen = some_mock_Popen

result = subprocess.call(...)

assert some_mock_popen.result == result

subprocess.call()将调用subprocess.Popen(),我们可以模拟它,而不必以特殊的方式注入依赖.我们可以直接替换subprocess.Popen. (这只是一个例子;在现实生活中,你会以更加健壮的方式做到这一点)

如果对更复杂的情况使用依赖注入,或者模拟整个模块或类不适用(因为例如,您只想嘲弄一个特定的调用),则使用类属性或模块全局变量作为依赖项是通常的选择.例如,考虑到一个my_subprocess.py:

from subprocess import Popen

def my_call(...):

return Popen(...).communicate()

您只能通过分配给my_subprocess.Popen来轻松替换由my_call()创建的Popen调用;它不会影响任何其他调用subprocess.Popen(但它会替换所有调用my_subprocess.Popen,当然).类似地,类属性:

class MyClass(object):

Popen = staticmethod(subprocess.Popen)

def call(self):

return self.Popen(...).communicate(...)

当使用这样的类属性时,考虑到这些选项很少需要,你应该注意使用staticmethod.如果不这样做,并且您插入的对象是一个正常的函数对象或另一种类型的描述符,就像一个属性,在从类或实例中检索到时,会执行一些特殊的描述,它会做错事.更糟糕的是,如果你现在使用的东西不是一个描述符(比如subprocess.Popen类,在这个例子中),它现在就可以工作,但是如果有问题的对象改变了一个正常的功能,那么它将会令人困惑.

最后,只有简单的回调;如果您只想将特定实例的类绑定到特定的服务,则可以将服务(或一项或多项服务的方法)传递给类初始化程序,并使用它:

class MyClass(object):

def __init__(self, authenticate=None, authorize=None):

if authenticate is None:

authenticate = default_authenticate

if authorize is None:

authorize = default_authorize

self.authenticate = authenticate

self.authorize = authorize

def request(self, user, password, action):

self.authenticate(user, password)

self.authorize(user, action)

self._do_request(action)

...

helper = AuthService(...)

# Pass bound methods to helper.authenticate and helper.authorize to MyClass.

inst = MyClass(authenticate=helper.authenticate, authorize=helper.authorize)

inst.request(...)

当设置这样的实例属性时,您不必担心描述符触发,所以只需分配函数(或类或其他可调用或实例)即可.

python依赖注入_如何做依赖注入python方式?相关推荐

  1. python依赖注入_什么是依赖注入?

    这篇文章是关于一般依赖关系注入和在PHP中实现依赖注入容器系列的第一部分. 今天我不会谈论容器然而我想以一些具体的示例介绍依赖注入的概念希望说明尝试去解决问题和它给开发者带来的好处.如果你已经知道依赖 ...

  2. java什么是依赖注入_什么是依赖注入?

    转自 https://blog.csdn.net/coding_1994/article/details/80634810,这位作者写的很清晰. Spring 能有效地组织J2EE应用各层的对象.不管 ...

  3. 引入yml依赖包_手把手教你发布 Python 项目开源包

    编译:机器之心,作者:Gabriel Lerner.Nathan Toubiana 好不容易码了个 python 项目,是不是很兴奋?那么怎么把这个项目发出去让大家看到呢?本文作者写了一份在 GitH ...

  4. java 依赖倒置_设计模式之三依赖倒置原则(DIP)

    依赖倒置(Dependence Inversion Principle,DIP) High level modules should not deppend oupon low level modul ...

  5. 反引号注入_什么是 SQL 注入?

    (给ImportNew加星标,提高Java技能) 转自:Java程序员联盟 文章目录: 何谓SQL注入? SQL数据库操作示例 SQL数据库注入示例 如何防止SQL注入问题 SQL数据库反注入示例 何 ...

  6. 永远不要去依赖别人_不要太依赖一个人说说 永远都不要依赖任何人的经典句子...

    1.任何时候独立是很重要的,不要想去依赖任何人.人与人之间的距离,朋友也好,恋人也好,都不需要太近,人心很复杂,不需要看的太清楚. 2.加油呀,一个人要好好的,你要知道,世界上可以依赖的只有你自己,不 ...

  7. mysql dns 注入_数据库DNSLog外带注入-总结

    sql注入中利用的骚姿势你又知道几个? DNSLog外带注入和DNSlog带外注入?(OOB) 其实是一样的,叫法不同!本人还是习惯叫外带注入,自我感觉,比较顺口 为什么需要外带注入? 当我们对一个数 ...

  8. python半圆代码_趣味项目:用Python代码做个月饼送给你!

    所用工具 1.Python中的turtle包 2.对Python似火的热情 先来介绍一番 Turtle作图又叫海龟作图,是Python中比较有趣的一个模块,功能强大,使用方便.简单来说,比如有一块空地 ...

  9. python 两点曲线_十行代码,用Python做一个迷你版的美图秀秀

    美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽.今天小编就带领大家来借助Python和Flask来实现一个美图秀秀的网页设计,大家只需要通过网页上传 ...

最新文章

  1. 广东蓝桥杯c语言编译器_小软访谈之榜样充电站 千里之行,始于足下——“蓝桥杯”获奖者采访...
  2. 计算机网络动画是什么软件,把动漫人头p人身上的软件叫什么 软件介绍
  3. mysql_install_db卸载_MySQL数据库的卸载与安装
  4. LG P4899 [IOI2018] werewolf 狼人(kruskal重构树,二维数点)
  5. 阅读笔记:基础知识(Java篇)
  6. 用PostgreSQL运行文件中的SQL程序
  7. Linux 更改共享内存tmpfs的大小
  8. c linux下并行编程指南,Linux环境下C编程指南(第2版)
  9. antd table动态表头_React项目使用ant Table组件动态生成columns
  10. 华为手机微信小程序上传不了照片
  11. 服务器pci-e硬盘,来一发干货,PCI-E SSD硬盘使用须知
  12. win7安装Android Studio
  13. python摄氏温度换算_python华氏温度转为摄氏温度
  14. 优锘科技:森模型插件上新:BIM秒变轻量化,模板任选效果
  15. 语言表达能力强的人真的就情商高吗?
  16. Entity Framework 基础知识走马观花
  17. 【金融123】ISDA协议
  18. 机械设计自动化行业现在吃香吗?有前途吗?
  19. wasc honeypot
  20. rt-link源码笔记,适用于自定义点对点的通信协议

热门文章

  1. 笔记本电脑摄像头不能用_电脑没有摄像头怎么办
  2. 奥运会上刷新亚洲记录的211高校副教授苏炳添论文被扒出,网友:膜拜大神!...
  3. 翟天临凌晨回应“毕业季被声讨”
  4. 年仅26岁!这位双一流大学的特任教授,攻克世界数学难题
  5. 到达什么水平才能算是学会了数学?
  6. 中国学者Nature发文:国内的学术不端之风该整顿了
  7. 《北大学科》第一季:数学篇
  8. 看完白鹤滩水电站建造历程 感觉《流浪地球》那些真能造出来
  9. 一位数学家的传统节日
  10. 梅森素数:千年不休的探寻之旅