Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.
Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.
2 824 подписчиков · @BookPython
К каналу →
Pytest Patterns: Элегантный Teardown через yield и оптимизация скоупов Если вы все еще пишете def teardown_method(self): в классах тестов, вы не используете мощь Pytest на 100%. Ф…
Читать далее →
6 793
Одной из самых непоследовательных частей синтаксиса Python являются литералы кортежей. По сути, чтобы создать кортеж, вы просто пишете значения, разделенные запятыми: 1, 2, 3. Пок…
Читать далее →
6 766

Protocol vs ABC: Static Duck Typing в Python

Ранее мы затронули типизацию в фикстурах (косвенно), поэтому сегодня поговорим про:

Protocol vs ABC: Утиная типизация на стероидах (Static Duck Typing)

В классическом ООП (Java, C#) и при использовании abc.ABC в Python мы привыкли к Nominal Subtyping (Именная подтипизация). Чтобы объект считался Bird, он должен явно наследоваться от Bird.
Это создает жесткую связность (coupling): ваша реализация должна знать об интерфейсе и импортировать его.

С приходом typing.Protocol (Python 3.8+) мы получили Structural Subtyping (Структурная подтипизация).

В чем суть?
Если класс имеет метод quack(), то это Утка. Неважно, от чего он наследуется. Это и есть та самая «утиная типизация», но теперь поддерживаемая статическим анализатором (mypy, pyright, IDE).

Сравним код:

❌ Старый путь (ABC):

from abc import ABC, abstractmethod

# 1. Жестко определяем интерфейс
class SenderABC(ABC):
@abstractmethod
def send(self, msg: str) -> None: pass

# 2. Обязаны наследоваться!
class EmailService(SenderABC):
def send(self, msg: str) -> None:
print(f"Email: {msg}")

def alert(sender: SenderABC):
sender.send("Alert!")
✅ Новый путь (Protocol):

from typing import Protocol

# 1. Описываем, "что мы ждем от объекта"
class SenderProto(Protocol):
def send(self, msg: str) -> None: ...

# 2. Реализация НИЧЕГО не знает про Protocol
# Никаких импортов и наследования!
class SmsService:
def send(self, msg: str) -> None:
print(f"SMS: {msg}")

# Mypy счастлив: SmsService имеет нужную структуру (метод send)
def alert(sender: SenderProto):
sender.send("Alert!")

alert(SmsService())
Киллер-фича: Retroactive Abstraction (Ретроактивная абстракция)
Представьте, что вы используете стороннюю библиотеку (например, boto3 или клиент Redis). Вы не можете заставить их классы наследоваться от ваших ABC.
С помощью Protocol вы можете создать интерфейс для уже существующего чужого кода, не меняя его, и типизировать свои функции.

Нюансы для Middle+:

1. Runtime: По умолчанию isinstance(obj, MyProtocol) выбросит ошибку. Протоколы - это compile-time фича. Если нужна проверка в рантайме, декорируйте протокол @runtime_checkable.

2. Свойства: В протоколе можно описывать не только методы, но и поля через @property или просто аннотации типов.

Используйте Протоколы, чтобы развязать зависимости между модулями. Это основа принципа Dependency Inversion в Python.

#python #typing #mypy #architecture #clean_code

👉 @BookPython
Если у вас есть ресурсоемкая задача для процессора и вы хотите использовать все доступные ядра, то multiprocessing.Pool - это то, что вам нужно. Он создает несколько процессов и ав…
Читать далее →
6 989
10 полезных библиотек для Python-разработчика Сегодня я подготовил для вас подборку из 10 полезных библиотек, которые могут сделать вашу разработку проще и эффективнее. Поехали! 🚀…
Читать далее →
6 960
Другие главы канала «Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.»
Выберите главу, чтобы продолжить чтение
Все посты →
Глава от 20.06.2026
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 ht…
👁 53 просмотров
Глава от 18.06.2026
Python позволяет перегружать многие разные операторы, и оператор сдвига — один и…
👁 548 просмотров
Глава от 16.06.2026
Класс объекта доступен через атрибут __class__: >>> [1, 2].__class__ <class 'li…
👁 639 просмотров
Глава от 16.06.2026
👩‍💻 Контейнеризация Java-приложений с Docker Приглашаем на открытый урок. 🗓 22…
👁 609 просмотров
Глава от 16.06.2026
В Python числа с плавающей точкой могут иметь значение NaN. Его можно получить с…
👁 652 просмотров
Глава от 15.06.2026
В Python None равен None, поэтому может показаться, что проверку на None можно д…
👁 823 просмотров
Глава от 12.06.2026
В Python разные структуры данных объединяются разными способами. Списки использ…
👁 973 просмотров
Глава от 11.06.2026
Когда ИИ-агент выходит за пределы экспериментов, одного «умного чата» становится…
👁 1 022 просмотров
Глава от 11.06.2026
Словари, которые используются для хранения атрибутов объектов, не такие же, как …
👁 1 024 просмотров

Популярные посты канала «Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.»

Создание объекта в Python включает два ключевых этапа. Сначала вызывается метод __new__, который создаёт и возвращает новый объект. Затем вы…
👁 8 001 просмотров
Как упростить работу с аргументами в командной строке с помощью typer Раньше для CLI-приложений на Python я использовал argparse, потом был…
👁 8 001 просмотров
🚀 Как логировать без боли в Python Как настроить логирование в Python один раз — и больше к этому не возвращаться. Обычно начинающие разра…
👁 7 972 просмотров
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https…
👁 7 963 просмотров
💡 Как избежать повторения кода с помощью functools.partial Как упростить код и избежать дублирования с помощью functools.partial. Допустим…
👁 7 955 просмотров
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https…
👁 7 903 просмотров
В Python оператор квадратных скобок [] можно переопределить, реализовав магический метод __getitem__. Это позволяет, например, создать объек…
👁 7 848 просмотров
Популярный способ объявить абстрактный метод в Python — это выбросить исключение NotImplementedError: def human_name(self): raise NotIm…
👁 7 822 просмотров
Встроенные значения float в Python используют оборудование вашего компьютера напрямую, поэтому любое значение представляется внутренне в вид…
👁 7 798 просмотров
Иногда в программе нужна очередь — контейнер, куда элементы добавляются с одной стороны и извлекаются с другой. В Python для этого можно исп…
👁 7 789 просмотров
Существует два понятия с похожими названиями, которые легко перепутать: переопределение (overriding) и перегрузка (overloading). Переопреде…
👁 7 746 просмотров
⚠️ Можно знать алгоритмы машинного обучения и всё равно получать плохие результаты. Большинство проблем моделей начинаются с некачественной …
👁 7 724 просмотров
Иногда возникает необходимость выполнить участок кода и проигнорировать все возможные исключения. Это оправдано в случае с плагинами, сторон…
👁 7 678 просмотров
Некоторый код может выводить интересующие вас данные в stdout, вместо того чтобы предоставлять API, возвращающий строку, пригодную для испол…
👁 7 638 просмотров
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https…
👁 7 612 просмотров
Обычно вы взаимодействуете с генератором, запрашивая данные с помощью next(gen). В Python 3 вы также можете отправлять значения обратно в ге…
👁 7 605 просмотров
Скрытые фичи Enum: как выжать максимум Многие используют Enum как простой список констант. Но у enum.Enum в Python есть куда больше возможн…
👁 7 601 просмотров
В Python имя переменной может состоять из одного символа подчёркивания: _. Хотя такие имена обычно недостаточно описательны и их не стоит ис…
👁 7 600 просмотров
Есть три ситуации, в которых только что созданную переменную нельзя аннотировать типом: распаковка кортежей, циклы for и инструкции with. В…
👁 7 589 просмотров
Чтобы отсортировать словарь по его значениям, используйте функцию sorted с пользовательской функцией ключа: >>> d = dict(a=1, c=3, b=2) >>>…
👁 7 554 просмотров

Связанные темы в других каналах

Каналы из той же тематики, где часто появляются близкие сюжеты
Вся тема →
@canalmaxone
AntiCloudMod
AntiCloudMod — сообщество для тех, кто ценит свободу общения без облачной цензуры. Здесь обсуждают альтернативные мессенджеры, инструменты для приватности и децентрализов…
👥 374 357 · +71 837/7д
@WylsacomRed
Wylsacom Red
Официальный канал Wylsacom в Max. Тут всё про технологии и жизнь в ногу со временем! Номер заявления для регистрации в РКН: № 6979154178 Розыгрыши: kichaev@wylsacom.med…
👥 154 794 · +9 870/7д
@BelgorodDRONE
Информация БПЛА Белгород, Белгородский район
Информация БПЛА Белгород, Белгородский район — специализированный канал в мессенджере Макс, посвященный новостям и информации о беспилотных летательных аппаратах в регион…
👥 139 563 · +9 163/7д
@TikTokModCloud
TikTokModCloud
Официальные обновления стабильного мода TikTok Чат: https://clck.ru/3S6mVh По рекламе: https://iimax.ru/dim4ugan
👥 83 764 · +19 675/7д
@hitech
Hi-Tech
Оперативные новости, обзоры гаджетов, собственное видео, трансляции мировых анонсов и мероприятий По вопросам сотрудничества и размещения рекламы i.ostapenko@corp.mail.r…
👥 53 169 · -214/7д
@na_kruchok
ГЛЕНТ | МЕМЫ
Глент мемы Это фан-сообщество, созданное преданными поклонниками для поддержки творчества Глента. Данный канал НЕ является официальным и ведется фанатом. Биржа: telega…
👥 50 429 · +39 410/7д
🏷 Темы и теги
#python #typing #mypy #architecture #clean_code #telegram bots #web scraping #django #fastapi #asyncio #Технологии
📋 О канале Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.
Учим язык Python на практике. Создание веб-приложений: Django, Flask, FastAPI. Пишем ботов для Телеграм на Aiogram. Парсинг сайтов (Web Scraping): Selenium, BeautifulSoup (BS4), Scrapy. Работа с базами данных (PostgreSQL, Redis, SQL) и API. Асинхронное программирование (Asyncio). Настройка Docker, Git и Linux. Алгоритмы, задачи с собеседований и Roadmap для Junior Python Developer.
🔍 Архив всех постов Макс
Поиск по 8,891,494 постам из 201,201 каналов
Попробовать за 1 ₽ →
Удалить пост или канал с МАКСОТЕКИ
Заявка подтверждается через бота Макс: нужно быть администратором канала и добавить бота МАКСОТЕКИ в администраторы. После проверки канал или конкретный пост скрывается с сайта.
📊 Аналитика канала «Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.» ➡️ Перейти в канал Макс
Заявка в МАКСОТЕКА
Добавьте свой канал в каталог
Зарегистрируйтесь в личном кабинете и добавьте канал за пару кликов.
Перейти в личный кабинет →

Бесплатная регистрация, быстрая модерация.