python - 为什么 IoC/DI 在 Python 中不常见?

标签 python design-patterns dependency-injection inversion-of-control architecture

在 Java 中 IoC/DI是一种非常普遍的做法,广泛用于 Web 应用程序、几乎所有可用的框架和 Java EE。另一方面,也有很多大型 Python Web 应用程序,但除了 Zope(我听说这对代码来说应该是非常可怕的)之外,IoC 在 Python 世界中似乎并不常见。 (如果你认为我错了,请举几个例子)。

当然有几个流行的可用于 Python 的 Java IoC 框架的克隆,springpython例如。但它们似乎都没有被实际使用。至少,我从来没有偶然发现过 Djangosqlalchemy + <insert your favorite wsgi toolkit here>基于 Web 应用程序,它使用类似的东西。

在我看来,IoC 具有合理的优势,例如可以很容易地替换 django-default-user-model,但是 Python 中接口(interface)类和 IoC 的广泛使用看起来有点奇怪,而不是“pythonic”。但也许有人有更好的解释,为什么 IoC 在 Python 中没有被广泛使用。

最佳答案

我实际上并不认为 DI/IoC 在 Python 中是不常见的。然而, 不常见的是 DI/IoC 框架/容器

想一想:DI 容器有什么作用?它可以让你

  1. 将独立的组件组合成一个完整的应用程序...
  2. ...在运行时。

我们有“连接在一起”和“运行时”的名称:

  1. 脚本
  2. 动态

因此,DI 容器只不过是动态脚本语言的解释器。实际上,让我换个说法:一个典型的 Java/.NET DI 容器只不过是一个糟糕的解释器,它是一种非常糟糕的动态脚本语言,它的语法很糟糕,有时是基于 XML 的。

当您使用 Python 进行编程时,当您拥有一种漂亮、出色的脚本语言可供您使用时,为什么还要使用一种丑陋、糟糕的脚本语言?实际上,这是一个更普遍的问题:当您使用几乎任何语言进行编程时,当您可以使用 Jython 和 IronPython 时,为什么还要使用丑陋、糟糕的脚本语言?

因此,回顾一下:DI/IoC 的实践在 Python 中与在 Java 中一样重要,原因完全相同。然而,DI/IoC 的实现是内置在语言中的,并且通常非常轻量级,以至于它完全消失了。

(这里有一个简短的类比:在汇编中,子程序调用是一个非常重要的交易 - 您必须将局部变量和寄存器保存到内存中,将返回地址保存在某处,将指令指针更改为您的子程序正在调用,安排它在完成后以某种方式跳回您的子例程,将参数放在被调用者可以找到它们的地方,等等。IOW:在汇编中,“子例程调用”是一种设计模式,并且在此之前像 Fortran 这样内置子程序调用的语言,人们正在构建自己的“子程序框架”。你会说子程序调用在 Python 中“不常见”,只是因为你不使用子程序框架吗?)

顺便说一句:有关将 DI 得出其合乎逻辑的结论的示例,请查看 Gilad BrachaNewspeak Programming Language以及他关于这个主题的著作:

关于python - 为什么 IoC/DI 在 Python 中不常见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2461702/

相关文章:

python - Flask 从引导下拉列表按钮请求的数据不在收到的 POST 中

当其中一个实现需要额外步骤时,用于避免泄漏抽象的 C# 模式

c# - 将规范模式公开给客户端代码的标准做法?

dependency-injection - 缺少方法异常 : No parameterless constructor defined for type

python - 深入——yield from inside yield

python - 在自定义代码中处理NoneType异常

c++ - lock_guard 是 RAII 实现还是用于实现 RAII?

dependency-injection - 我如何告诉 InstallShield 程序集依赖项没有被引用但被依赖注入(inject)统一使用?

c# - ASP.NET Core 3 - 在 services.AddSingelton<IMySingletone, MySingletone>(); 之后立即实例化一个单例;

python - 如何修复以下代码?