eConti - программирование в вопросах и ответах

Как Python реализует внедрение зависимостей, если у него нет интерфейсов?

Насколько я понимаю, клиент (основная программа) должен иметь общий тип, чтобы плагин, другой объект и т. д. могли быть успешно переданы клиенту. Я видел этот ответ на SO здесь,

Что такое внедрение зависимостей?

В Java передача конструктора с использованием предустановленного интерфейса имеет смысл. Из упомянутого вопроса SO,

public SomeClass (MyClass myObject) {
    this.myObject = myObject;
}

Насколько я понимаю, MyClass — это тип, определяемый интерфейсом. myObject реализует это, что на самом деле требуется, что позволяет мне передать myObject конструктору.

Так как же работает Dependency Injection на языке утиной печати? Python не имеет интерфейсов. Является ли реализация DI Python такой же, как Java или другие статически типизированные языки, или это «обходной» тип DI для языков сценариев?


Ответы:


1

Потребность в интерфейсе — это всего лишь деталь Java. Это то, что позволяет вам определить функцию, которая может принимать экземпляр любого из нескольких не связанных между собой типов.

Поскольку каждая функция Python может принимать экземпляр любого типа, нет необходимости в чем-то сопоставимом.

Конечно, если вы передаете объект, у которого нет необходимых возможностей, в какой-то момент вы получите исключение. В Python есть так называемые «неявные интерфейсы» — интерфейс, требуемый функцией, — это любые операции, которые она выполняет над объектом, ожидая, что они сработают.

27.03.2014
  • Спасибо. Как мне гарантировать, что я получу правильный тип, переданный моему основному классу? В Java, если мне требуется реализация интерфейса, я могу создать конструктор плагинов, используя свой интерфейс. Как я могу сделать это в Python? 27.03.2014
  • Документируйте свой код, включайте в документацию явные спецификации, ожидайте, что спецификации будут соблюдаться. Когда ничего не помогает, ловите исключение. 27.03.2014
  • @johnny: во-первых, имейте в виду, что реализация интерфейса просто означает, что объект имеет правильные сигнатуры методов. Это не гарантирует, что объект ведет себя правильно, вы всегда полагаетесь на то, что кто-то реализует спецификацию. Python говорит, что тип — это еще не все, на самом деле он настолько мал, что мы не собираемся гарантировать его при каждой возможности, как это делает Java. Тем не менее, в Python вы можете использовать type() или instanceof() для проверки типа, если вам это действительно нужно, и вы можете использовать ABC для явного определения интерфейсов, если хотите. 27.03.2014
  • @SteveJessop Да, но разве Интерфейс не заставляет создание плагина иметь определенные методы и свойства? Похоже, что для языков без интерфейсов используется соглашение об именах, по крайней мере, это то, что я видел в PHP. Это не имеет значения, пока работает скороговорка. По какой-то причине я чувствовал, что Интерфейс был более надежным. 28.03.2014
  • Новые материалы

    ИИ для общего блага, часть вторая
    В нашем последнем блоге мы исследовали возможности ИИ для общего блага, указав на несколько инициатив по поиску действенных решений для продвижения справедливых и беспристрастных систем ИИ. По..

    Время расцвета закончилось
    Большую часть своей карьеры в индустрии программного обеспечения программисты работали с головой в песок. Успех в отрасли требует навыков презентации и обучения других. Ценность улучшенных..

    Будущее сельского хозяйства: новый уровень производительности с современными технологиями
    По мере роста населения мира растет и спрос на продукты питания. Фермеры сталкиваются с растущим давлением необходимости повышать урожайность и максимизировать производительность, манипулируя..

    Состояние совместной фильтрации в 2022 году, часть 1
    ResBeMF: Улучшение прогнозируемого охвата совместной фильтрации на основе классификации (arXiv) Автор: Анхель Гонсалес-Прието , Авраам Гутьеррес , Фернандо Ортега , Рауль Лара-Кабрера..

    Зачем изучать PYTHON в 2022 году !
    Python — востребованный, доступный язык программирования с активным, постоянно растущим сообществом пользователей. Для тех, кто хочет сменить профессию в мире технологий с помощью..

    Решение капч с помощью Puppeteer
    Это руководство предназначено для текстовых кодов, а не для reCAPTCHA Google (см. конец этого сообщения). Требования: Антикапча или любой другой сервис по разгадыванию капчи. Модуль..

    7 встроенных библиотек Python, которые необходимо знать
    7 встроенных библиотек Python, которые необходимо знать Стандартная библиотека Python значительно упрощает жизнь программистов, предоставляя широкий набор функций. Мы выбираем несколько..