为什么IOC/DI在Python中没有Java那么流行?

看了一些帖子, 结合我自己的理解:

DI的作用是什么

  • 将系统的构建和使用分离,
    • 代码实现各个component
    • IoC container实现组装, wire components
  • 在runtime实现compnents组装
  • 一般通过额外的Java config或者xml配置IoC

IoC/DI 是一种思想

  • 和具体的语言实现无关, 静态的构建系统components, 动态的组装components使用系统

Python中Ioc/DI

  • Python可以实现framework类似Java中Spring独立的IoC/DI container, 将系统构建使用相分离
  • 因为Python自身是动态语言, 同时也具备scripting能力, 所以完全可以不需要额外写config/xml. 相当于把Ioc/DI能力和语言本身揉在了一起, 即没有分开处理系统的构建和使用.
  • 在Java中如果在一个class中new 另一个class, 那么就是紧耦合, 代码写好之后没法改变, 在Python中new 一个class完全可以dynamic runtime替换, 例如:
class Dog:
    def say_hello(self):
        print("Dog says Hello.")


class Cat:
    def say_hello(self):
        print("Cat says Hello.")


def hello():
    dog = Dog()
    dog.say_hello()


hello()
# Dog says Hello.

Dog = Cat
hello()
# Cat says Hello.

总结

Python提供了更加灵活的构建系统和使用系统的方式:

  • 如果Java程序员习惯Java的DI方式那么可以考虑使用Python的DI framework,
  • 利用Python的动态性, 不用DI framework也可以灵活的构建和使用系统, 只不过不像Java DI分离的那么清晰

参考