Попытка понять внедрение зависимости - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь выучить понятие «внедрение зависимости» в Python. Во-первых, если у кого-то есть хорошая ссылка, пожалуйста, укажите мне.

В качестве проекта я использовал вариант изменения логики c и форматирования на основе параметров, переданных в команду linux "mtr"

Класс клиента зависимости - MtrRun. Первоначальный сервис внедрения зависимостей - DefaultRgx (я планирую добавить еще пару). Интерфейс инъекции - MtrOptions. А класс инжекторов просто называется Injector.

class MtrRun(MtrOptions):  # Dependency injection client
    def __init__(self, MtrOptions, options, out):
        self.MtrOptions = MtrOptions
        self.options = options
        self.out = out

    def mtr_options(self, options, out):
        return self.MtrOptions.mtr_options(options, out)
class DefaultRgx(MtrOptions):  # Dependency injection service
    def __init__(self, options):
        self.options = None

    def mtr_options(self, options, out): 
        pass  # code abbreviated for clarity
class MtrOptions():  # Dependency injection interface
    def __init__(self, svc):
        self.svc = svc

    def mtr_options(self, options, out):
        return self.svc.mtr_options(options, out)
class Injector():  # Dependency injection injector
    def inject(self):
        MtrOptions = MtrOptions(DefaultRgx())
        mtr_result = MtrRun(MtrOptions)

Этот фрагмент не удалит пух. Моя IDE утверждает, что класс MtrOptions, переданный клиенту и сервису внедрения, не определен. Когда я пытаюсь разрешить его, создается новый класс MtrOptions, но ошибка сохраняется. Я уверен, что просто не знаю, что я делаю. Концептуально я допускаю слабую гр asp. Помощь приветствуется.

1 Ответ

0 голосов
/ 24 марта 2020

Так что я перепутал несколько способов. Я не понял декларативный способ установить наследство sh. Ничто в моем примере не было «объектом». Во-вторых, порядок, кажется, имеет значение. Классы объектов, кажется, должны появиться раньше своих детей. В-третьих, класс инжектора должен включать обе стороны классов для инъекции.

class DefaultRgx(object):  # Dependency injection service
    def __init__(self, options):
        self.options = None

    def mtr_options(self, options, out): 
        mtr_result = ['Do stuff the old way']
        return mtr_result


class MtrRun(DefaultRgx):  # Dependency injection client
    def __init__(self, host, count, options):
        self.count = count
        self.host = host
        self.options = options

    def mtr_module(self, host, count, options):
        mtr_result = super().mtr_options(options, out)
        return mtr_result


class MtrOptions(DefaultRgx):  # Dependency injection interface
    def mtr_options(self, options, out):
        mtr_result = ['I was injected instead of DefaultRgx']
        return mtr_result


class Injector(MtrOptions, MtrRun):  # Dependency injection injector
    pass


def main():
    mtr = Injector(os.getenv('HOST'), os.getenv('COUNT'), None)
    mtr_result = mtr.mtr_module()

Это указано правильно. Я еще не запускал его, но концептуально YouTube действительно помог. Большое вам спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...