1. Углубление Python: ООП, типизация, пакеты и стиль кода
Углубление Python: ООП, типизация, пакеты и стиль кода
Ты уже знаешь базовые конструкции Python (функции, классы на уровне «что это», try/except). Дальше для трудоустройства на backend важно научиться писать код, который:
В этой статье разберём четыре опоры: ООП, типизация, пакеты/структура проекта и стиль кода.
ООП, которое используют в backend
ООП в работе — это не «везде классы», а способ управлять сложностью: прятать детали, гарантировать инварианты (правила корректности) и делать расширение безопасным.
Инкапсуляция и инварианты
Инкапсуляция — когда объект сам отвечает за свою корректность, а внешний код не ломает его состояние напрямую.
Пример инварианта: баланс счёта не должен становиться отрицательным.
Ключевые моменты:
_balance — внутренняя переменная (по соглашению), к ней не должны обращаться напрямую.@property — безопасный доступ «как к полю», но с контролем.Полезно: Документация Python про property
@classmethod и @staticmethod
Это частая тема на собеседованиях и в реальном коде.
@staticmethod — обычная функция, просто лежит в классе «для группировки».@classmethod — метод, который получает сам класс (cls) и часто используется как альтернативный конструктор.Композиция важнее наследования
В backend чаще выигрывает композиция: «объект имеет зависимость», а не «объект является чем-то».
!Сравнение наследования и композиции
Абстракции: ABC и протоколы
Когда проект растёт, появляется потребность описывать «контракт»: какие методы должен иметь объект.
Варианты:
abc.ABC — классическая абстрактная база.typing.Protocol — контракт для типизации (особенно удобен для duck typing: «если выглядит как утка — это утка»).Полезно: Документация Python про abc
dataclass для моделей данных
Очень часто в backend есть сущности «данные + немного логики»: DTO, результаты запросов, параметры.
dataclass экономит время и уменьшает количество шаблонного кода.
frozen=True делает объект неизменяемым (полезно для предсказуемости и потокобезопасности).
Полезно: Документация Python про dataclasses
Типизация: как писать код, который проще поддерживать
Type hints в Python не делают язык статическим. Это подсказки для:
Официальный раздел: Документация Python про typing
Базовые аннотации типов
Важно:
mypy)Optional, Union и современный синтаксис
Когда значение может отсутствовать:
str | None — современная запись (Python 3.10+), эквивалент Optional[str].
Обобщённые типы (generics)
Когда нужно «любой тип»:
TypedDict для словарей с фиксированной схемой
В backend много JSON-подобных структур. TypedDict помогает документировать ожидаемые ключи.
Protocol для «утиной типизации»
Очень полезно, когда ты хочешь принимать любой объект с нужным методом, не привязываясь к конкретному базовому классу.
Статическая проверка: mypy
mypy запускается отдельно и находит ошибки типа «передал не тот тип», «вернул не то», «забыл обработать None».
Пример запуска:
Модули, пакеты и структура проекта
Backend-проект — это не один файл. Нужна структура, импорты, окружение, зависимости.
Модуль и пакет
something.py.__init__.py, и на практике его продолжают использовать.Официально: Документация Python про модули
Как Python ищет импорты
Python ищет модули по sys.path (текущая папка, установленные пакеты, пути окружения). В работе важнее правило:
Рекомендации:
src/ для кода приложенияpython -m package), а не «из случайной директории»Пример структуры backend-проекта
Минимальный вариант:
Виртуальные окружения
Виртуальное окружение изолирует зависимости проекта.
Пример:
Установка зависимостей: pip и pyproject.toml
pip — стандартный установщик: pip documentationpyproject.toml: Packaging Python ProjectsНа практике часто используют менеджеры зависимостей:
Важная идея для работы:
Стиль кода: как писать «по-командному»
Код читают чаще, чем пишут. В командах стиль стандартизируют инструментами.
PEP 8 и нейминг
Базовый стандарт: PEP 8
Критично запомнить:
snake_case для функций и переменныхPascalCase для классовUPPER_CASEДокстринги
Докстринги нужны для публичных функций/классов и сложной логики.
Рекомендации по соглашениям: PEP 257
Пример:
Инструменты качества кода
Лучше не спорить о пробелах и переносах, а автоматизировать.
| Задача | Инструмент | Зачем | |---|---|---| | автоформатирование | Black | единый стиль без обсуждений | | линтинг | Ruff | быстрый поиск ошибок и плохих практик | | проверка типов | mypy | ловит ошибки типов до запуска |
Типичный минимум для backend-репозитория:
print vs logging
В backend вместо print почти всегда используют logging, потому что:
DEBUG, INFO, WARNING, ERROR)Документация: logging
Пример: