第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

python中的多級(jí)依賴注入

python中的多級(jí)依賴注入

暮色呼如 2022-09-13 19:58:11
我有5個(gè)類,如下所示。執(zhí)行從類 5 開(kāi)始。在這里,依賴注入被用作偵聽(tīng)器對(duì)象傳遞給類的構(gòu)造函數(shù),然后該對(duì)象調(diào)用 listen() 方法。這部分很好。Bot麻煩從現(xiàn)在開(kāi)始。從方法中,我調(diào)用另一個(gè)調(diào)用的方法,該方法位于類( 文件中)中。然后,該方法從 2 個(gè)不同的類和 中調(diào)用另外兩個(gè)方法。listen()process()Processorprocessor.pyprocess()TokenizerCore如您所見(jiàn),所有這些都是耦合的,此處不使用依賴關(guān)系注入。我不知道該怎么做。我已經(jīng)嘗試了python包和包的示例,但據(jù)我所知,這些示例與單級(jí)依賴關(guān)系有關(guān),而不是這樣的情況。dependency-injectorpinject我曾想過(guò)在一個(gè)模塊中創(chuàng)建所有必需的對(duì)象,并在需要時(shí)將其作為參數(shù)傳遞給所有類。但這似乎不是一個(gè)好習(xí)慣。我能做些什么來(lái)解耦上面的代碼?我應(yīng)該如何進(jìn)行模塊化?# core.pyclass Core:    def decide(self, data):        """ Makes decisions based on input data """        # blah blah-# tokenizer.pyimport nltkfrom nltk.corpus import stopwordsfrom nltk.tokenize import word_tokenizestoplist = set(stopwords.words('english'))class Tokenizer:    def tokenize(self, query):        """ Tokenize the input query string """        tokenized_query = word_tokenize(query)        clean_query = [w for w in tokenized_query if not w in stoplist]        return clean_query-# processor.pyimport tokenizerimport coreclass Processor:    def process(self, query):        """         Send the input query to tokenizer         tokenized input is send to the Core module for decision making        """        tokenized_input = tokenizer.Tokenizer().tokenize(query)        core.Core().decide(tokenized_input)-# listener.pyimport processorclass Listener:    def listen(self):        """ Continuosly listens to user input """        while True:            query=input()            processor.Processor().process(query)-# bot.pyimport listenerclass Bot:    def __init__(self, listener):        listener.listen()Bot(listener.Listener())
查看完整描述

2 回答

?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

我認(rèn)為你可以重新考慮這個(gè)設(shè)計(jì),記住兩個(gè)概念:

  1. Python 多重繼承來(lái)設(shè)計(jì)你的類。

  2. 使用 super() 和 Python 的方法解析順序 (MRO) 在測(cè)試代碼中注入類依賴項(xiàng)的模擬。

關(guān)于第一點(diǎn),您的類將如下所示:

# core.py


class Core:

    def decide(self, data):

        """ Makes decisions based on input data """


        # blah blah


# tokenizer.py


class Tokenizer:

    def tokenize(self, query):

        """ Tokenize the input query string """

        return query


# processor.py

# from tokenizer import Tokenizer

# from core import Core


class Processor(Core, Tokenizer):

    def process(self, query):

        """ 

        Send the input query to tokenizer 

        tokenized input is send to the Core module for decision making

        """

        tokenized_input = super().tokenize(query)

        super().decide(tokenized_input)


# listener.py

# from processor import Processor


class Listener(Processor):

    def listen(self):

        """ Continuosly listens to user input """

        while True:

            query=input()

            super().process(query)


# bot.py

#from listener import Listener


class Bot(Listener):

    def start_listener(self):

        super().listen()



Bot().start_listener()

通過(guò)這種OO設(shè)計(jì)和super()的使用,我們可以利用MRO在類的依賴項(xiàng)中注入模擬,我將展示如何在SUT(被測(cè)主題)中為其依賴項(xiàng)注入模擬。


機(jī)器人和處理器的示例:


class MockCore(Core):

    def decide(self, data):

        """ Here you can implement the behavior of the mock """


class MockTokenizer(Tokenizer):

    def tokenize(self, query):

        """ Here you can implement the behavior of the mock """

        return query


class ProcessorSut(Processor, MockCore, MockTokenizer):

    'Here we are injecting mocks for Processor dependencies'


class Bot(Listener):

    def start_listener(self):

        super().listen()


class MockListener(Listener):

    def listen(self):

        """ Here you can implement the behavior of the mock """

        return


class BotSut(Bot, MockListener):

    'Here we are injecting a mock for the Listener dependency of Bot'

看到我們的SUT類的MRO,我們可以理解為什么多重繼承和super()的使用允許我們以這種方式注入模擬。


機(jī)器人和處理器解決方案的結(jié)果 MRO:


Help on class BotSut in module __main__:


class BotSut(Bot, MockListener)

 |  Here we are injecting a mock for the Listener dependency of Bot

 |  

 |  Method resolution order:

 |      BotSut

 |      Bot

 |      MockListener

 |      Listener

 |      Processor

 |      Core

 |      Tokenizer

 |      builtins.object

...

...

Help on class ProcessorSut in module __main__:


class ProcessorSut(Processor, MockCore, MockTokenizer)

 |  Here we are injecting mocks for Processor dependencies

 |  

 |  Method resolution order:

 |      ProcessorSut

 |      Processor

 |      MockCore

 |      Core

 |      MockTokenizer

 |      Tokenizer

 |      builtins.object


查看完整回答
反對(duì) 回復(fù) 2022-09-13
?
楊__羊羊

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊

您可以將實(shí)用程序類設(shè)置為類屬性:


class Core:

    def decide(self, data):

        return False



class Tokenizer:

    def tokenize(self, query):

        return []  # ...



class Processor:

    tokenizer_class = Tokenizer

    core_class = Core


    def process(self, query):

        tokenized_input = self.tokenizer_class().tokenize(query)

        return self.core_class().decide(tokenized_input)



class Listener:

    processor_class = Processor


    def listen(self):

        while True:

            query = input()

            self.processor_class().process(query)

然后,您可以使用測(cè)試框架的模擬/補(bǔ)丁功能,例如pytest的:monkeypatch


def test_foo(monkeypatch):

    monkeypatch.setattr(Processor, 'tokenizer_class', FooTokenizer)

    # etc...


查看完整回答
反對(duì) 回復(fù) 2022-09-13
  • 2 回答
  • 0 關(guān)注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)