не имеет полезной концепции программирования на основе интерфейса (как в интерфейсах C #)
То, что компилятор не может проверить, правильно ли вы используете интерфейс, не означает, чтоmsgstr "нет полезной концепции интерфейсов".Вы документируете интерфейс и пишете модульные тесты.
Что касается глобалов, то не похоже, чтобы public static
методы и поля в классах C # или Java действительно отличались.Рассмотрим, например, как работает java.lang.Math.Теперь рассмотрим тот факт, что java.lang.Math не синглтон.Они сделали это по уважительной причине.
При всех этих вкусностях действительно есть какой-то смысл в контейнере для инъекций зависимостей
Я сомневаюсь в этом, но тогда я так и не увиделсмысл их в C # или Java, либо.Внедрение зависимости - это, на мой взгляд, методика .И в этом тоже нет ничего особенного.
Я всегда подозревал, что инъекция зависимости как шаблон дизайна была дурным запахом, который создавался всем, должен быть классом «нацистского мышления»
Нет, это не так.Внедрение зависимостей - хорошая идея в большинстве случаев.Вам также не нужен класс для внедрения зависимостей.Каждый раз, когда вы передаете что-то свободной функции в качестве параметра, вместо того, чтобы функция вызывала другую функцию для получения информации, вы в основном делаете одно и то же: инверсия управления.Python также позволяет обрабатывать модули аналогично классам разными способами (конечно, больше, чем в Java и C #).Есть проблемы, которые могут быть решены путем передачи модулей в качестве параметров в функции.:)
До сих пор я думаю, что могу покрывать фабрики, синглтоны, объекты с несколькими экземплярами, просто используя Globals.
Синглтоны - плохой запах, если что-нибудь.Практически в каждом случае, по моему обширному опыту, они существуют, потому что кто-то думал, что было бы плохо (TM) в принципе иметь глобальный, не задумываясь о возможных вариантах, или почему они хотели такого рода доступ к одному общему объектуили даже почему глобальные «изначально плохие (TM)».
Вы могли бы создать глобальную функцию в Python, которая действует как фабрика.Тем не менее, я бы сказал, что Pythonic делает что-то из следующего:
a) во-первых, сделайте действительно, действительно, действительно убедитесь, что вы не можете просто делать то, что хотите с __init__
.Я имею в виду, что в динамически типизированном языке вы можете таким образом много чего сделать.
b) Если __init__
его не обрезает, попробуйте использовать __new__
для управления поведением.
В Python классы сами являются объектами, которые можно вызывать.По умолчанию их вызов создает экземпляр класса.С помощью __new__
вы можете подключиться к этому.
c) Использовать декоратор, примененный к классу.Вот пример, который делает Singleton (только потому что):
def _singleton(cls):
instance = cls()
result = lambda: instance
result.__doc__ = cls.__doc__
return result
@_singleton
class example(object): pass
Способ, которым это работает: когда вы декорируете класс, вызывается _singleton()
с передачей класса. Создается экземпляри кэшируется, и _singleton()
возвращает анонимную функцию, которая будет возвращать экземпляр при вызове.Чтобы закончить шараду, документация класса прикреплена к анонимной функции.Затем Python связывает имя класса в глобальной области видимости с возвращенной анонимной функцией.Поэтому, когда вы вызываете его, вы каждый раз получаете один и тот же экземпляр класса.
Теперь, конечно, это все еще можно обойти (вы можете сделать что-то вроде example().__class__()
, чтобы получить другой экземпляр),но гораздо яснее, что вы делаете что-то не так, чем если бы вы просто игнорировали фабричную функцию, чтобы нормально использовать конструктор.Кроме того, это означает, что вызывающий код фактически действует так, как если бы он вызывал конструктор в обычном режиме:)
Duck Typing - это то, что меня сейчас привлекает, поэтому он используется для определения интерфейсов, а затем базирования классовна этих интерфейсах и позволяя статическим вещам покрывать мою глупость, которую я чувствую, что без статической типизации контейнеры немного бесполезны.
Вам нужно изменить свое мышление: перестаньте беспокоиться о том, что вам передали , является , и беспокойтесь о , может ли он делать то, что вы хотите, чтобы .Вот как работает утка.