2014-03-27 58 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來明確定義接口。 –