静态和动态语言中的依赖注入
Posted
技术标签:
【中文标题】静态和动态语言中的依赖注入【英文标题】:Dependency injection in static and dynamic languages [closed] 【发布时间】:2016-01-20 21:43:20 【问题描述】:我知道在 Java 中,依赖注入让生活变得更好。有很多注释处理器框架将 bean 映射到对象并方便地将它们注入到正确的位置。
但我从未听说过 Python 或 Ruby 中的 dependency injection
,例如。这种语言有内置支持吗?还是他们不需要?为什么?
【问题讨论】:
一个有趣的话题,但太宽泛了。 【参考方案1】:简而言之,在 Python 中,依赖注入不如在 Java 中重要,因为模块的状态特性和元编程的作用。
在像 Java 这样的语言中,类通常为对象定义蓝图,这些对象必须在运行时通过导入它们的任何东西来实例化。当您导入一个类时,您只会获得该类的配方。
相反,在 Python 中导入模块可以做更多的事情。在导入期间,您实际上是在命名空间中运行模块的代码 - 这意味着模块不仅可以构造模块本身引用的单例,而且甚至可以执行复杂的任务,例如在执行导入期间连接到数据库。当两个模块导入相同的引用模块时,第二个模块从第一次导入时继承 Python 的模块评估概念,保留和更改第一个导入器可能所做的。此外,在 Python 和 Ruby 中扫描子模块要比在 Java 中轻松得多,Java 中更多的框架使用模块放置来指示功能(例如 Django 中的 models.py),而不是在 Java 中看到的(通常有利于注解)。
TLDR:Python(和 Ruby)中的模块和类是有状态的,在 Java 中难以复制或无法复制,import 语句的机制提供了依赖注入的大部分有趣部分(尽管不是 IoC)。它不存在,只是没有必要。
另请参阅:Why is IoC / DI not common in Python?
【讨论】:
我理解正确吗,Python 能够导入具有一些非默认状态的对象(模块)?模块在导入后是否有一些预处理来实现非默认状态? @Rudik 有问题的“预处理”——实际上只是解释——发生在运行时。当您导入 python 模块时,Python 会运行组成它的代码并将结果存储在模块名称下。 Python 在内存中保留所有导入模块的隐藏(意味着可通过双下划线访问)注册表。导入 python 已经知道的模块会导致对该模块的引用,而不是对其定义代码的新调用,从而允许程序中的多个导入器引用一个模块 - 这实际上是一个单例。以上是关于静态和动态语言中的依赖注入的主要内容,如果未能解决你的问题,请参考以下文章