python依赖注入_如何做依赖注入python方式?
這一切都取決于情況.例如,如果您使用依賴注入來進行測試,所以您可以輕松地嘲笑某些內容 – 您可以經常放棄注入:您可以嘲笑您將注入的模塊或類:
subprocess.Popen = some_mock_Popen
result = subprocess.call(...)
assert some_mock_popen.result == result
subprocess.call()將調用subprocess.Popen(),我們可以模擬它,而不必以特殊的方式注入依賴.我們可以直接替換subprocess.Popen. (這只是一個例子;在現實生活中,你會以更加健壯的方式做到這一點)
如果對更復雜的情況使用依賴注入,或者模擬整個模塊或類不適用(因為例如,您只想嘲弄一個特定的調用),則使用類屬性或模塊全局變量作為依賴項是通常的選擇.例如,考慮到一個my_subprocess.py:
from subprocess import Popen
def my_call(...):
return Popen(...).communicate()
您只能通過分配給my_subprocess.Popen來輕松替換由my_call()創建的Popen調用;它不會影響任何其他調用subprocess.Popen(但它會替換所有調用my_subprocess.Popen,當然).類似地,類屬性:
class MyClass(object):
Popen = staticmethod(subprocess.Popen)
def call(self):
return self.Popen(...).communicate(...)
當使用這樣的類屬性時,考慮到這些選項很少需要,你應該注意使用staticmethod.如果不這樣做,并且您插入的對象是一個正常的函數對象或另一種類型的描述符,就像一個屬性,在從類或實例中檢索到時,會執行一些特殊的描述,它會做錯事.更糟糕的是,如果你現在使用的東西不是一個描述符(比如subprocess.Popen類,在這個例子中),它現在就可以工作,但是如果有問題的對象改變了一個正常的功能,那么它將會令人困惑.
最后,只有簡單的回調;如果您只想將特定實例的類綁定到特定的服務,則可以將服務(或一項或多項服務的方法)傳遞給類初始化程序,并使用它:
class MyClass(object):
def __init__(self, authenticate=None, authorize=None):
if authenticate is None:
authenticate = default_authenticate
if authorize is None:
authorize = default_authorize
self.authenticate = authenticate
self.authorize = authorize
def request(self, user, password, action):
self.authenticate(user, password)
self.authorize(user, action)
self._do_request(action)
...
helper = AuthService(...)
# Pass bound methods to helper.authenticate and helper.authorize to MyClass.
inst = MyClass(authenticate=helper.authenticate, authorize=helper.authorize)
inst.request(...)
當設置這樣的實例屬性時,您不必擔心描述符觸發,所以只需分配函數(或類或其他可調用或實例)即可.
總結
以上是生活随笔為你收集整理的python依赖注入_如何做依赖注入python方式?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: upgrade yum 指定版本_Cen
- 下一篇: python 生成器_Python生成器