In Java IoC http://en.wikipedia.org/wiki/Inversion_of_Control / DI http://en.wikipedia.org/wiki/Dependency_Injection是一种非常常见的做法,广泛用于 Web 应用程序、几乎所有可用的框架和 Java EE。另一方面,也有很多大型 Python Web 应用程序,但除了 Zope(我听说它编码起来真的很糟糕)之外,IoC 在 Python 世界中似乎并不常见。 (如果您认为我错了,请举一些例子)。
当然,有几个流行的 Java IoC 框架的克隆版本可用于 Python,弹簧蟒蛇 http://springpython.webfactional.com/例如。但它们似乎都没有被实际使用。至少,我从来没有遇到过Django http://www.djangoproject.com/ or sqlalchemy http://www.sqlalchemy.org/+<insert your favorite wsgi toolkit here>
基于网络应用程序,使用类似的东西。
在我看来,IoC 具有合理的优势,并且可以轻松替换 django-default-user-model,但在 Python 中广泛使用接口类和 IoC 看起来有点奇怪,而且不“pythonic”。但也许有人有更好的解释,为什么 IoC 没有在 Python 中广泛使用。
我实际上并不认为 DI/IoC 是that在 Python 中不常见。什么is然而,不常见的是 DI/IoC框架/容器.
想一想:DI 容器是做什么的?它可以让你
- 将独立组件连接到一个完整的应用程序中...
- ...在运行时。
我们有“连接在一起”和“运行时”的名称:
- 脚本编写
- dynamic
因此,DI 容器只不过是动态脚本语言的解释器。实际上,让我重新表述一下:典型的 Java/.NET DI 容器只不过是一个蹩脚的解释器,用于一种非常糟糕的动态脚本语言,其语法非常丑陋,有时是基于 XML 的。
当您使用 Python 编程时,当您拥有一种漂亮、出色的脚本语言时,为什么要使用一种丑陋、糟糕的脚本语言呢?实际上,这是一个更普遍的问题:当您使用几乎任何语言进行编程时,如果您可以使用 Jython 和 IronPython,为什么还要使用丑陋、糟糕的脚本语言呢?
所以,回顾一下:practice出于完全相同的原因,DI/IoC 在 Python 中与在 Java 中同样重要。这执行然而,DI/IoC 的功能是内置于语言中的,而且通常非常轻量,以至于完全消失了。
(这里有一个简短的类比:在汇编中,子例程调用是一件非常重要的事情 - 你必须将局部变量和寄存器保存到内存中,将返回地址保存在某处,将指令指针更改为你正在调用的子例程,安排它在完成时以某种方式跳回子例程,将参数放在被调用者可以找到它们的地方,等等。IOW:在汇编中,“子例程调用”是一种设计模式,在出现像这样的语言之前Fortran 内置了子程序调用,人们正在构建自己的“子程序框架”。您是否会说子程序调用在 Python 中“不常见”,只是因为您不使用子程序框架?)
顺便说一句:有关如何通过 DI 得出逻辑结论的示例,请查看吉拉德·布拉查 http://GBracha.BlogSpot.Com/'s 新话编程语言 http://NewspeakLanguage.Org/以及他关于该主题的著作:
- 构造函数被认为是有害的 http://GBracha.BlogSpot.Com/2007/06/constructors-considered-harmful.html
- 注射死刑 http://GBracha.BlogSpot.Com/2007/12/some-months-ago-i-wrote-couple-of-posts.html
-
禁止进口 http://GBracha.BlogSpot.Com/2009/06/ban-on-imports.html (继续 http://GBracha.BlogSpot.Com/2009/07/ban-on-imports-continued.html)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)