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

当然,有几个流行的Java IOC框架可用于Python,例如springpython个.但它们似乎都没有得到实际apply.至少,我从来没有偶然发现过一个基于Djangosqlalchemy+<insert your favorite wsgi toolkit here>的Web应用程序,它使用这样的东西.

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

推荐答案

我实际上并不认为DI/IOC在Python中是that%罕见的.然而,is不同寻常的是DI/IOC frameworks/containers.

想想看:DI容器做什么?它允许你

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

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

  1. 编写脚本
  2. 动态的

因此,DI容器只是动态脚本语言的解释器.实际上,让我重新表述一下:一个典型的Java/.NETDI容器只是一个蹩脚的解释器,用于一种非常糟糕的动态脚本语言,它的语法非常难看,有时是基于XML的.

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

因此,简单地说:出于完全相同的原因,在Python中DI/IOC的practice与在Java中一样重要.然而,DI/IoC的implementation是内置在语言中的,而且通常是如此轻量级,以至于它完全消失了.

(这里有一个简短的类比:在汇编中,子程序调用是一件非常重要的事情——您必须将局部变量和寄存器保存到内存中,将返回地址保存到某个地方,更改指向正在调用的子程序的指令指针,安排它在完成后以某种方式跳回子程序,将argu被叫人可以找到的地方,等等.IOW:在汇编语言中,"子程序调用"是一种设计模式,在像Fortran这样内置子程序调用的语言出现之前,人们正在构建自己的"子程序框架".你会说在Python中,子程序调用是"不常见的",仅仅因为你不使用子程序框架吗?)

顺便说一句:关于将DI带到其逻辑结论的例子,请看一下Gilad Bracha's Newspeak Programming Language和他关于这个主题的著作:

Python相关问答推荐

如何在Windows上用Python提取名称中带有逗号的文件?

如何让程序打印新段落上的每一行?

用Python解密Java加密文件

Python解析整数格式说明符的规则?

如何从列表框中 Select 而不出错?

重置PD帧中的值

Discord.py -

如何删除重复的文字翻拍?

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

python的文件. truncate()意外地没有截断'

Python协议不兼容警告

为什么在Python中00是一个有效的整数?

设置索引值每隔17行左右更改的索引

如何将验证器应用于PYDANC2中的EACHY_ITEM?

某些值的数值幂和**之间的差异

如何让PYTHON上的Selify连接到现有的Firefox实例-我无法连接到Marionette端口

Django REST框架+Django Channel->;[Errno 111]连接调用失败(';127.0.0.1';,6379)

根据两个lambda条件筛选组并根据条件创建新列的最佳方式是什么?

更改Python中的数据格式

在忽略on列中的重复值的同时连接polars重命名