当前位置: 首页 > 面试题库 >

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

易琨
2023-03-14
问题内容

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

当然,有一些流行的Java
IoC框架可用于Python,例如springpython。但是它们似乎都没有被实际使用。至少,我从来没有在一个stumpled
Django的或SQLAlchemy的+
<insert your favorite wsgi toolkit here>,它使用类似的东西,基于Web应用程序。

我认为IoC具有合理的优势,例如可以轻松替换django-default-user-
model,但是在Python中广泛使用接口类和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中是“罕见的”,仅仅是因为您不使用子例程框架吗?)



 类似资料:
  • 下面是Xml配置的工作原理 以下XML配置不起作用 我知道,我们可以使用反射更改私有访问规范。 我的问题是为什么Spring如此设计,如果构造器是私有的,Spring DI可以工作,但如果Setter方法是私有的,Spring DI不起作用。 Spring Designers在这个设计背后可能的动机是什么? 为什么他们允许私有构造器时不允许私有设置器?

  • 本文向大家介绍请问什么是IoC和DI?并且简要说明一下DI是如何实现的?相关面试题,主要包含被问及请问什么是IoC和DI?并且简要说明一下DI是如何实现的?时的应答技巧和注意事项,需要的朋友参考一下 考察点:控制反转 参考回答: IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠释。控制反转是把传统上

  • 问题内容: 我知道Google搜索可以找到合适的答案,但是我更喜欢听您的个人(也许是技术性的)意见。 Java和C#之间在引发异常方面有所不同的主要原因是什么? 在Java中,引发异常的方法的签名必须使用“ throws”关键字,而在C#中,您不知道在编译时是否可以引发异常。 问题答案: 因为对已检查异常的响应几乎总是: 如果您确实知道如果抛出特定异常,您可以执行某些操作,那么您可以捕获该异常,然

  • 问题内容: 为什么这项工作有效- 但这不是- 第二种情况下的输出为。你能解释一下输出吗? 问题答案: 该方法没有返回值。它会在适当的位置更改列表,并且由于您没有将分配给任何变量,因此只是“迷失在空间” 我没有重载所有有问题的方法,但是概念应该很清楚。

  • 我在不同的地方对此进行了研究,包括stackoverflow,但我找不到一个对我有帮助的答案。 我使用的是Windows 7,64位,Atom用于64位Windows。我在目录C:\Users\Austin\Documents\Python中安装了Python 3.6.1。当我试图在Atom中运行一个简单的脚本来测试Python时,它说 “python”不被识别为内部或外部命令、可操作程序或批处理

  • 目前,缺乏关于DI主题依赖注入的文档。与现有解决方案(Ninject、Autofac、StructureMap)相比,使用内置DI有哪些优点/缺点?默认依赖注入的当前限制是什么(如果有的话)?