Я насправді не думаю, що DI / IoC є такою рідкістю в Python. Однак , рідкість - це рамки / контейнери DI / IoC .
Подумайте: що робить контейнер DI? Це дозволяє вам
- з'єднайте незалежні компоненти в повну програму ...
- ... під час виконання.
У нас є назви "проводка разом" і "під час виконання":
- сценаріїв
- динамічний
Отже, контейнер DI - це не що інше, як інтерпретатор мови динамічного сценарію. Насправді, дозвольте перефразувати це: типовий контейнер для Java / .NET DI - це не що інше, як хитрий інтерпретатор дійсно поганої динамічної мови сценаріїв із непотворним, іноді на основі XML синтаксисом.
Коли ви програмуєте в Python, чому ви хочете використовувати некрасиву, погану мову сценаріїв, коли у вас є красива, блискуча мова сценаріїв? Насправді, це більш загальне питання: коли ви програмуєте майже будь-якою мовою, чому ви хочете використовувати некрасиву, погану мову сценаріїв, коли у вас є Jython та IronPython?
Отже, підводячи підсумки: практика DI / IoC настільки ж важлива в Python, як і в Java, з точно тих же причин. Однак реалізація DI / IoC вбудована в мову і часто настільки легка, що повністю зникає.
(Ось короткий відбій для аналогії: при складанні виклик підпрограми є досить важливою справою - вам потрібно зберегти локальні змінні та регістри в пам'яті, десь зберегти свою зворотну адресу, змінити вказівник інструкцій на підпрограму, яку ви телефонуєте, домовтеся, щоб якимось чином перескочив назад у вашу підпрограму, коли вона закінчиться, покладіть аргументи кудись, де їх може знайти їх, і т. д. IOW: у зборі «виклик підпрограми» - це шаблон дизайну, і раніше існували такі мови, як У Fortran, в якому були вбудовані виклики підпрограми, люди будували свої власні "рамки підпрограми". Ви б сказали, що виклики підпрограми є "рідкістю" в Python, тільки тому, що ви не використовуєте рамки підпрограми?)
BTW: для прикладу того, як виглядає сприйняття DI до його логічного завершення, подивіться на мову новомовного програмування Гілада Брача та його статті на цю тему: