在 Java 中 IoC/DI是一种非常普遍的做法,广泛用于 Web 应用程序、几乎所有可用的框架和 Java EE。另一方面,也有很多大型 Python Web 应用程序,但除了 Zope(我听说这对代码来说应该是非常可怕的)之外,IoC 在 Python 世界中似乎并不常见。 (如果你认为我错了,请举几个例子)。
当然有几个流行的可用于 Python 的 Java IoC 框架的克隆,springpython例如。但它们似乎都没有被实际使用。至少,我从来没有偶然发现过 Django或 sqlalchemy + <insert your favorite wsgi toolkit here>
基于 Web 应用程序,它使用类似的东西。
在我看来,IoC 具有合理的优势,例如可以很容易地替换 django-default-user-model,但是 Python 中接口(interface)类和 IoC 的广泛使用看起来有点奇怪,而不是“pythonic”。但也许有人有更好的解释,为什么 IoC 在 Python 中没有被广泛使用。
最佳答案
我实际上并不认为 DI/IoC 在 Python 中是那不常见的。然而, 不常见的是 DI/IoC 框架/容器。
想一想:DI 容器有什么作用?它可以让你
- 将独立的组件组合成一个完整的应用程序...
- ...在运行时。
我们有“连接在一起”和“运行时”的名称:
- 脚本
- 动态
因此,DI 容器只不过是动态脚本语言的解释器。实际上,让我换个说法:一个典型的 Java/.NET DI 容器只不过是一个糟糕的解释器,它是一种非常糟糕的动态脚本语言,它的语法很糟糕,有时是基于 XML 的。
当您使用 Python 进行编程时,当您拥有一种漂亮、出色的脚本语言可供您使用时,为什么还要使用一种丑陋、糟糕的脚本语言?实际上,这是一个更普遍的问题:当您使用几乎任何语言进行编程时,当您可以使用 Jython 和 IronPython 时,为什么还要使用丑陋、糟糕的脚本语言?
因此,回顾一下:DI/IoC 的实践在 Python 中与在 Java 中一样重要,原因完全相同。然而,DI/IoC 的实现是内置在语言中的,并且通常非常轻量级,以至于它完全消失了。
(这里有一个简短的类比:在汇编中,子程序调用是一个非常重要的交易 - 您必须将局部变量和寄存器保存到内存中,将返回地址保存在某处,将指令指针更改为您的子程序正在调用,安排它在完成后以某种方式跳回您的子例程,将参数放在被调用者可以找到它们的地方,等等。IOW:在汇编中,“子例程调用”是一种设计模式,并且在此之前像 Fortran 这样内置子程序调用的语言,人们正在构建自己的“子程序框架”。你会说子程序调用在 Python 中“不常见”,只是因为你不使用子程序框架吗?)
顺便说一句:有关将 DI 得出其合乎逻辑的结论的示例,请查看 Gilad Bracha的Newspeak Programming Language以及他关于这个主题的著作:
关于python - 为什么 IoC/DI 在 Python 中不常见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2461702/