考慮一個模塊,例如模塊。各種模塊在相同的解釋器過程中使用。這個模塊只有一個上下文。爲了使some_module
方法起作用,它必須接收一個類實例的依賴注入。對模塊的依賴注入
什麼是pythonic和優雅的方式注入依賴項的模塊?
考慮一個模塊,例如模塊。各種模塊在相同的解釋器過程中使用。這個模塊只有一個上下文。爲了使some_module
方法起作用,它必須接收一個類實例的依賴注入。對模塊的依賴注入
什麼是pythonic和優雅的方式注入依賴項的模塊?
恕我直言,認爲羽翼豐滿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。
使用模塊全局。
import some_module
some_module.classinstance = MyClass()
some_module
可以有代碼來設置一個默認實例,如果沒有收到一個,或只設置classinstance
到None
和檢查,以確保它被調用的方法時設置。
您可以使用dependencies
package來實現您的目標。
這不是依賴注入,而是服務定位器。 – deamon
@deamon可能是沒有,可能是'get_feature('logger')'是服務定位器,但set_feature在應用程序開始時注入MyLogger,這是差異之間的良好鏈接http://martinfowler.com/ articles/injection.html#ServiceLocatorVsDependencyInjection –
不幸的是,這是一個服務定位器。和[服務定位器是一個反模式](http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern) –