python依赖注入_如何做依赖注入python方式?
這一切都取決于情況.例如,如果您使用依賴(lài)注入來(lái)進(jìn)行測(cè)試,所以您可以輕松地嘲笑某些內(nèi)容 – 您可以經(jīng)常放棄注入:您可以嘲笑您將注入的模塊或類(lèi):
subprocess.Popen = some_mock_Popen
result = subprocess.call(...)
assert some_mock_popen.result == result
subprocess.call()將調(diào)用subprocess.Popen(),我們可以模擬它,而不必以特殊的方式注入依賴(lài).我們可以直接替換subprocess.Popen. (這只是一個(gè)例子;在現(xiàn)實(shí)生活中,你會(huì)以更加健壯的方式做到這一點(diǎn))
如果對(duì)更復(fù)雜的情況使用依賴(lài)注入,或者模擬整個(gè)模塊或類(lèi)不適用(因?yàn)槔?您只想嘲弄一個(gè)特定的調(diào)用),則使用類(lèi)屬性或模塊全局變量作為依賴(lài)項(xiàng)是通常的選擇.例如,考慮到一個(gè)my_subprocess.py:
from subprocess import Popen
def my_call(...):
return Popen(...).communicate()
您只能通過(guò)分配給my_subprocess.Popen來(lái)輕松替換由my_call()創(chuàng)建的Popen調(diào)用;它不會(huì)影響任何其他調(diào)用subprocess.Popen(但它會(huì)替換所有調(diào)用my_subprocess.Popen,當(dāng)然).類(lèi)似地,類(lèi)屬性:
class MyClass(object):
Popen = staticmethod(subprocess.Popen)
def call(self):
return self.Popen(...).communicate(...)
當(dāng)使用這樣的類(lèi)屬性時(shí),考慮到這些選項(xiàng)很少需要,你應(yīng)該注意使用staticmethod.如果不這樣做,并且您插入的對(duì)象是一個(gè)正常的函數(shù)對(duì)象或另一種類(lèi)型的描述符,就像一個(gè)屬性,在從類(lèi)或?qū)嵗袡z索到時(shí),會(huì)執(zhí)行一些特殊的描述,它會(huì)做錯(cuò)事.更糟糕的是,如果你現(xiàn)在使用的東西不是一個(gè)描述符(比如subprocess.Popen類(lèi),在這個(gè)例子中),它現(xiàn)在就可以工作,但是如果有問(wèn)題的對(duì)象改變了一個(gè)正常的功能,那么它將會(huì)令人困惑.
最后,只有簡(jiǎn)單的回調(diào);如果您只想將特定實(shí)例的類(lèi)綁定到特定的服務(wù),則可以將服務(wù)(或一項(xiàng)或多項(xiàng)服務(wù)的方法)傳遞給類(lèi)初始化程序,并使用它:
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(...)
當(dāng)設(shè)置這樣的實(shí)例屬性時(shí),您不必?fù)?dān)心描述符觸發(fā),所以只需分配函數(shù)(或類(lèi)或其他可調(diào)用或?qū)嵗?即可.
總結(jié)
以上是生活随笔為你收集整理的python依赖注入_如何做依赖注入python方式?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: upgrade yum 指定版本_Cen
- 下一篇: python 生成器_Python生成器