为什么在python中是ioc / di不常见

如题所述

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简单的布尔逻辑。
温馨提示:内容为网友见解,仅供参考
无其他回答

为什么在python中是ioc \/ di不常见
部分原因是模块系统工作在Python的方式。你可以得到一种“单身”free的,只是从一个模块中导入它。定义一个对象的实际实例中的一个模块,然后任何客户端端代码可以导入并真正得到一个工作,全面构建\/填充对象。这是相对于Java的,在那里你不导入对象的实际情况。你总是有自己实例化它们,(排序的IoC \/ D...

python数据处理相关操作——loc、ioc、ix选取数据
loc方法通过标签选取数据。选取数据框中所有列的数据,可以表示为 loc[:, :]。根据标签选取数据更为直观,例如选取所有名为a的数据,可以表示为 loc['a']。ix方法较为灵活,可以同时使用行号和标签进行选取,兼容iloc和loc的使用方式。例如选取所有名为a且位于第一行的数据,可以表示为 ix['a', 0...

我说spring简直就是忽悠人的
我恶心java不是有两个原因,1是太墨迹了,比较臃肿,不简洁,不过也许看习惯就好了吧。2是当年的java,一弹出java那个窗口我就脑袋疼,512内存的机器基本跑个java程序就不用干什么了。不过这已经是过去式。java没有走下坡路,无论是C还是java都是编程的常青树。可以上各大权威网站查询。spring不是忽悠...

django如何执行exe文件(2023年最新分享)
首先你要明白这个命令是分三部分的,第一个是启动Python来执行文件,第二个是执行的文件名(setup.py),第三个是参数(install)。C:\\python27\\django\\python是不能执行的,因为在那个目录下并没有叫Python.exe的可执行文件。正确的写法应该是: c:\\python27\\pythonc:\\python27\\django\\setup.pyinstall 或者直接c:\\pyt...

java学完基础直接学框架(学java框架要多久)
PS:JavaSE的内容非常庞大,任何一套JavaSE教程都不会把所有的方法讲一遍,只会挑平时工作中常用的内容来讲解,所以JavaSE里面的内容很多都是课后自己在API文档中慢慢宽咐了解的,你自己一定要学会主动学习,不能坐以待毙。 推荐学习书籍:Java核心技术 二、数据库篇 数据库是学习Java语言必学的一项内容,常见的数据库就...

如何Android的资源和资源ID工作之间的映射
OR映射Java JDOJDO标准的一个实现Java HiveMind类似Spring的东西,微内核DI容器Java ExcaliburIoC容器Java 组件(共82)APR不同操作系统间可移植运行时库C\/C++ RegexpJava正则表达式Java OROPerl风格的正则表达式Java XercesXML解析,Java\/C两种版本Java\/C++ CrimsonXML解析器Java AXIOM更高效的DOM实现Java...

reportlab 怎么安装
1. 先安装pip a) https:\/\/pip.pypa.io\/en\/latest\/installing.html b) 获取上面网址的get-pip.py c) 运行python get-pip.py d) 安装完成之后 pip应用程序安装在C:\\Python27\\Scripts目录下,把这个路径加到path环境变量里面 e) cmd-》 输入pip -》可看到命令帮助,表示安装成功...

java学习路线
如需学习Java,推荐选择【达内教育】。Java学习路线一般有以下几个阶段:第一阶段,JavaSE基础:Java环境搭建、Java流程控制语句-for循环、switch选择判断、循环嵌套、数组拷贝等。第二阶段,JavaWeb:MySQL安装、管理、创建数据库、MySQLUPDATE查询、Mysql高级操作等。第三阶段,Java高级框架-SSH:Struts2异常...

零基础能学JAVA开发吗?
1、透彻理解面向对象 只有理解了面向对象才能感知Java开发的绝妙, 面向对象是Java中很重要的一个概念,如果理解不透彻的话,你可以在后期编程时会依然遵循面向过程的模式,理解概念很重要,但并不能帮助你太多,最重要的是要学会有面向对象概念来设计一个解决方案 2、掌握核心的API 看着容易做着难,能...

应该怎样学习JAVA?顺序是什么?
学习JavaEE或JavaME之前,JavaSE是必学的。Java开发环境搭建 Java基础语法 面向对象 数组 异常 集合 线程 IO流 反射机制 注解Annotation 网络编程 第二部分:数据库 【MySQL + JDBC】只要学习编程,数据库是一定要学习的,是一门公共的学科。java、C、python、C#等程序员都需要学习数据库。数据库产品...

相似回答