<p>我并不认为DI/IoC在Python中不常见。然而,<em>不常见的是DI/IoC<em>框架/容器</em>。</p>
<p>想想看:DI容器是做什么的?它允许你</p>
<ol>
<li>将独立的组件连接到一个完整的应用程序中。。。</li>
<li>。。。在运行时。</li>
</ol>
<p>我们有“连接在一起”和“运行时”的名称:</p>
<ol>
<li>脚本</li>
<li>动态的</li>
</ol>
<p>因此,DI容器只不过是动态脚本语言的解释器。实际上,让我重新表述一下:一个典型的Java/.NET DI容器只不过是一个糟糕的动态脚本语言的糟糕的解释器,它的语法很难看,有时是基于XML的。</p>
<p>当你用Python编程的时候,当你有一个漂亮的、出色的脚本语言可以使用的时候,你为什么要使用一个丑陋的、糟糕的脚本语言呢?实际上,这是一个更普遍的问题:当你用几乎任何一种语言编程时,当你拥有Jython和IronPython时,为什么要使用一种丑陋的、糟糕的脚本语言?</p>
<p>因此,概括一下:出于完全相同的原因,DI/IoC的<em>实践</em>在Python中与在Java中一样重要。然而,DI/IoC的<em>实现</em>是内置在语言中的,而且通常非常轻量级,以至于它完全消失。</p>
<p>(这里有一个简单的例子:在汇编中,一个子程序调用是一个非常重要的事情——你必须保存你的局部变量和寄存器到内存中,把你的返回地址保存在某个地方,改变你调用的子程序的指令指针,安排它在完成后以某种方式跳回你的子程序中,把在被调用者能找到它们的地方争论,等等。IOW:在汇编语言中,“子例程调用”是一种设计模式,在出现像Fortran这样有内置子例程调用的语言之前,人们正在构建自己的“子例程框架”。您是否会说,子例程调用在Python中是“不常见的”,仅仅因为您不使用子例程框架?)</p>
<p>顺便说一句:举一个例子,看看DI的逻辑结论,看看<a href="http://GBracha.BlogSpot.Com/" rel="noreferrer">Gilad Bracha</a>的<a href="http://NewspeakLanguage.Org/" rel="noreferrer">Newspeak Programming Language</a>和他关于这个主题的著作:</p>
<ul>
<li><a href="http://GBracha.BlogSpot.Com/2007/06/constructors-considered-harmful.html" rel="noreferrer">Constructors Considered Harmful</a></li>
<li><a href="http://GBracha.BlogSpot.Com/2007/12/some-months-ago-i-wrote-couple-of-posts.html" rel="noreferrer">Lethal Injection</a></li>
<li><a href="http://GBracha.BlogSpot.Com/2009/06/ban-on-imports.html" rel="noreferrer">A Ban on Imports</a>(<a href="http://GBracha.BlogSpot.Com/2009/07/ban-on-imports-continued.html" rel="noreferrer">continued</a>)</li>
</ul>