2014-03-27 61 views
1

据我所知,一个客户端(核心程序)需要有一个通用类型来允许一个插件,另一个对象等成功地传递给客户端。我看到这个答案上所以在这里,Python如何实现依赖注入,因为它没有接口?

What is dependency injection?

在Java中,使用规定的接口通过构造函数传递很有意义。从提到的SO问题,

public SomeClass (MyClass myObject) { 
    this.myObject = myObject; 
} 

据我了解,MyClass是一个接口定义的类型。 myObject实现它,实际上是必需的,因此允许我将myObject传递给构造函数。

那么依赖注入如何在鸭子打字语言中工作呢? Python没有接口。 Python的DI实现与Java或其他静态类型语言相同,还是脚本语言的“解决方法”类型DI?

回答

2

接口的需求只是Java的一个细节。这是可以让你定义一个函数的东西,它可以接受任何其他几种不相关类型的实例。

由于每个Python函数都可以接受任何类型的实例,因此不需要任何可比较的东西。

当然,如果您传入的对象不具备所需的功能,那么您会在某个时间点发生异常。 Python有所谓的“隐式接口” - 函数所需的接口是它在对象上执行的任何操作,以期望它们能够工作。

+0

谢谢。我如何*保证*我得到了正确的类型传递给我的核心类?在Java中,如果我需要一个接口实现,我可以使插件设计器使用我的接口。我怎样才能在Python中做到这一点? – johnny

+1

记录您的代码,在文档中包含显式的规格,期望遵循规范。当所有其他的失败时,赶上例外。 – wwii

+1

@johnny:首先,请记住,实现一个接口意味着对象具有正确的方法签名。它不能保证对象的行为正确,你总是依赖于实现规范的人。 Python说:“类型不是一切,事实上它很少,所以我们不打算在像Java那样的每个机会上保证它。”也就是说,如果你真的需要Python,你可以使用'type()'或'instanceof()'来检查类型,如果你愿意,你可以使用ABC来明确定义接口。 –