1. 其实我不认为直接投资/ IoC是在Python。什么是却是直接投资/ IoC。
想想看:什么是一个DI容器呢?它可以让你
连线连成应用程序...
...在
我们有“接线合”及“
脚本
动态
所以,一个DI容器不过是一个解释的动态脚本语言。实际上,另一种方式是:一个典型的Java / .NET的DI容器不过是一个蹩脚的解释器一个非常糟糕的动态脚本语言与对接丑陋,往往基于XML的语法。
当你在Python程序,你为什么会想要一个丑陋的,坏的脚本语言,当你有一个美丽的 CodeGo.net,辉煌的脚本语言在您的处置?其实,这是一个更普遍的问题:当您在几乎任何语言进行编程,为什么你想,当你有Jython和IronPython的在您的处置一个丑陋的,坏的脚本语言?
因此,要概括一下:DI / IOC的做法是一样重要的在Python中,因为它是在Java中,对于完全相同的原因。该DI / IOC的但是,是建立在语言和经常如此轻巧的消失。 (这里有一个比喻:在组装,子程序调用是一个相当大的交易-你要保存你的局部变量和寄存器保存返回地址的指令指针更改为你所呼叫的子程序,安排它跳回你的子程序当它完成时,把那里的被叫方可以找到他们,等IOW:在组装,“子程序调用”是一种设计模式,和之前有类似的Fortran语言,其中有建于子程序调用,人们建立自己的自己的“子程序你会说,子程序调用是”在Python中,只是你不'子程序
BTW:对于什么样子采取DI其逻辑的例子来看看吉rad的Bracha的新话编程语言以及他的著作的主题:
构造函数是有害的
注入死刑
禁止对导入(续)
2.
部分原因是模块系统工作在Python的方式。你可以得到一种“单身”free的,只是从一个模块中导入它。定义一个对象的实际实例中的一个模块,然后任何客户端端代码可以导入并真正得到一个工作,全面构建/填充对象。
这是相对于Java的,在那里你不导入对象的实际情况。你总是有自己实例化它们,(排序的IoC / DI样式的方法)。您可以减轻不必自己所拥有的静态(或实际工厂类)实例化一切的trouble,但你仍然招致实际创建新的每项资源开销
3.
使得Django的控制反转的。例如,数据库服务器被选中的配置文件,然后提供相应的数据库封装实例的数据库客户端端。
不同的是,Python有一流的类型。数据类型,包括类,都是自己的对象。如果你想要一个特定的类,只是这个类。例如:
if config_dbms_name == 'postgresql':
import psycopg
self.database_interface = psycopg
elif config_dbms_name == 'mysql':
...
再后来的代码可以通过书面表单创建一个数据库接口:
my_db_connection = self.database_interface()
# Do stuff with database.
取而代之的样板工厂的函数,Java和C ++的需要,Python做它与普通的代码一行或两行。这是函数性命令式编程的力量。
4.
在我看来,这样的事情依赖注入是一个刚性的,当代码过于沉重的主体轻易改变,你会发现自己不得不挑了小部分,定义接口为他们,然后让人们改变行为症状通过该插入这些接口的对象。这一切都很好,但最好避免在首位那种。
这也是一个静态类型语言的症状。当你要表达抽象的唯一工具是继承,那么这就是几乎什么无处不在。话虽如此,C ++是非常类似的,但从来没有拿起迷恋建设者和接口无处不在的Java开发人员做了。这是很容易得到过度旺盛能够以灵活且可扩展的,很少真正的好处写了太多的通用代码的成本的梦想。我认为这是一个文化的东西。
通常情况下,我认为Python的人来选择合适的工具来完成工作,这是一个连贯的和简单的整体,而不是一个真正的工具(一个可能的插件),可以做什么,但提供了可能的配置排列让人眼花缭乱。还是有可互换的零件在必要时,但不需要定义固定接口,由于鸭打字和语言的相对简单的灵活性大表单主义。
5.
避风港'的Python在好几年,但我会说,它更多的是与它是一个动态类型的语言比什么都重要。举个简单的例子,在Java中,如果我想测试写信给标准输出适当地我DI和传递任何的PrintStream捕捉写入的文字并进行验证。当我在Ruby中我的工作,但是,我可以动态替换“看跌期权”的方法在标准输出做验证,留出来的图片。如果我创建一个抽象的唯一原因是测试类,“它(认为文件系统操作或Java中的时钟),那么直接投资/ IoC创建的解决方案。
6.
我回来“约尔格・W米塔格”回答:“DI / IOC的Python是如此轻巧的消失”。
要备份此看一看在Martin Fowler的例子移植从Java到Python:Python的:Design_Patterns:Inversion_of_Control
正如您可以从上面的链接,一个“容器”在Python中看到可以写成8行代码:
class Container:
def __init__(self, system_data):
for component_name, component_class, component_args in system_data:
if type(component_class) == types.ClassType:
args = [self.__dict__[arg] for arg in component_args]
self.__dict__[component_name] = component_class(*args)
else:
self.__dict__[component_name] = component_class
7.
IoC和ruby,这是我的想法,为什么它没有被广泛流传
更新:
我不支持那个网站了,链接不工作,但可以在这里阅读
8.
其实,这是很容易写出足够干净的代码与DI(我不知道,会不会被/ Python的停留,然后,但无论如何:)),例如我其实perefer这样编码:
def polite(name_str):
return "dear " + name_str
def rude(a):
return name_str + ", you, moron"
def greet(name_str, call=polite):
print "Hello, " + call(name_str) + "!"
_
>>greet("Peter")
Hello, dear Peter!
>>greet("Jack", rude)
Hello, Jack, you, moron!
是的,这可以看作是函数/类只是一个简单的表单,但它确实工作。所以,也许Python的默认附带的电池足够在这里了。
P.S.我也贴这种幼稚的做法一个更大的示例在动态评估在Python简单的布尔逻辑。