2011-06-24 160 views
5

考慮一個模塊,例如模塊。各種模塊在相同的解釋器過程中使用。這個模塊只有一個上下文。爲了使some_module方法起作用,它必須接收一個類實例的依賴注入。對模塊的依賴注入

什麼是pythonic和優雅的方式注入依賴項的模塊?

回答

1

恕我直言,認爲羽翼豐滿Dependency Injection與所有的行話是更適合於靜態類型,如Java語言,在Python中,你能夠做到這很容易例如,這裏是裸骨injection

class DefaultLogger(object): 
    def log(self, line): 
     print line 

_features = { 
    'logger': DefaultLogger 
    } 

def set_feature(name, feature): 
    _features[name] = feature 

def get_feature(name): 
    return _features[name]() 

class Whatever(object): 

    def dosomething(self): 
     feature = get_feature('logger') 

     for i in range(5): 
     feature.log("task %s"%i) 

if __name__ == "__main__": 
    class MyLogger(object): 
     def log(sef, line): 
     print "Cool",line 

    set_feature('logger', MyLogger) 

    Whatever().dosomething() 

輸出:

Cool task 0 
Cool task 1 
Cool task 2 
Cool task 3 
Cool task 4 

如果你認爲缺少某些東西,我們可以很容易地添加它的python。

+1

這不是依賴注入,而是服務定位器。 – deamon

+0

@deamon可能是沒有,可能是'get_feature('logger')'是服務定位器,但set_feature在應用程序開始時注入MyLogger,這是差異之間的良好鏈接http://martinfowler.com/ articles/injection.html#ServiceLocatorVsDependencyInjection –

+0

不幸的是,這是一個服務定位器。和[服務定位器是一個反模式](http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern) –

2

使用模塊全局。

import some_module 
some_module.classinstance = MyClass() 

some_module可以有代碼來設置一個默認實例,如果沒有收到一個,或只設置classinstanceNone和檢查,以確保它被調用的方法時設置。