Какие паттерны проектирования используете чаще всего в Python-коде?

В продакшн‑коде на Python чаще всего применяют не «чистые» паттерны GoF, а их практичные формы: Factory/Factory Method и Strategy для инкапсуляции вариаций, Adapter/Facade для работы с внешними сервисами, Repository/Service для разделения слоёв домена и инфраструктуры, Decorator (в том числе синтаксический @decorator) для кросс‑срезочных задач.
Подробный ответ

На собеседовании по Python от middle обычно ждут не перечисления всех 23 паттернов GoF, а понимания, как решать типичные задачи архитектуры в живом коде.

Фабрики и фабричные функции (Factory, Factory Method)

В Python часто используют простые фабричные функции или классы‑фабрики:

  • скрыть детали конфигурации объекта (клиент к БД, HTTP‑клиент, репозиторий);

  • выбирать конкретную реализацию по настройкам/окружению (mock vs real, разные драйверы);

  • интегрировать с DI‑контейнерами.

Стратегия (Strategy)

Strategy удобно использовать там, где есть несколько алгоритмов под один интерфейс:

  • разные политики ретраев;

  • варианты расчёта цены/скидок;

  • разные провайдеры уведомлений (email, SMS, push).

В Python стратегия часто выглядит как набор классов с общим интерфейсом или просто набор функций/корутин, хранящихся в словаре по ключу (mapping[key](...)), плюс Protocol для типобезопасности.

Адаптер и Фасад (Adapter, Facade)

При работе с внешними сервисами (платёжки, CRM, склад) удобно:

  • делать Adapter, который приводит неудобный/шумный внешний API к нашему доменному интерфейсу;

  • строить поверх нескольких низкоуровневых клиентов Facade — один высокоуровневый сервис, который решает задачу бизнеса и прячет детали интеграций.

Это даёт более чистый доменный код и упрощает тестирование (можно подменять фасад или адаптер).

Repository и Service (слой домена / слой приложений)

Частый практический паттерн в Python‑backend — Repository + Service:

  • Repository инкапсулирует доступ к данным (БД, кеш, внешние API), возвращая доменные объекты;

  • Service реализует бизнес‑логику, опираясь на репозитории и другие сервисы, не зная деталей БД.

Это помогает держать доменную логику независимой от инфраструктуры, облегчает миграции между БД и тестирование.

Декоратор (в том числе синтаксический @decorator)

Декоратор в Python естественен благодаря синтаксису @name:

  • логирование и трассировка вызовов;

  • кеширование (@lru_cache, свои декораторы кеша);

  • контроль доступа, ретраи, метрические счётчики;

  • единая обработка ошибок.

Важно уметь писать декораторы и понимать, как они влияют на сигнатуры функций (использование functools.wraps и typing).

Observer / Pub‑Sub, CQRS, Event‑driven

В более сложных системах часто всплывают event‑подходы:

  • Observer / Pub‑Sub: внутренний event‑bus или брокер сообщений (Kafka, RabbitMQ) со слушателями;

  • CQRS и разделение команд/запросов в приложениях с насыщенным доменом.

Реализуются они чаще на уровне инфраструктуры (брокеры, handlers), но важно понимать мотив: развязать отправителя и получателя, масштабировать обработку, упростить расширение поведения.

Хорошая формулировка для ответа

В реальном Python‑коде я чаще использую фабрики и strategy для выбора поведения, adapter/facade для интеграций с внешними системами, Repository/Service для разделения домена и инфраструктуры и декораторы для кросс‑срезочных задач (логирование, кеш, ретраи, права доступа). При нужной сложности системы добавляются event‑подходы (Observer/pub‑sub) и элементы CQRS. Чистые классовые паттерны GoF я подстраиваю под идиоматику Python (функции первого класса, декораторы, dataclasses, typing).

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге