Веб-версияОткрыть в Telegram

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

15 сентября 2026
Б
Библиотека 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 📲 Мы в MAX 👉@BookPython
14 · 1.1K ·

Рядом в ленте

ББиблиотека Python разработчика | Книги по питонуЛовушка замыканий: Почему ваши лямбды в цикле сломаны (Late Binding) Вы пишете код, который генерирует список функций (например, колбэки для кнопок в UI или динББиблиотека Python разработчика | Книги по питону⚡ Как ускорить код на Python? Используем map, filter, reduce ⚡ Привет, друзья! Сегодня расскажу о том, как можно ускорить выполнение кода, заменяя обычные циклы
это сообщение
ББиблиотека Python разработчика | Книги по питонуЕсли у вас есть ресурсоемкая задача для процессора и вы хотите использовать все доступные ядра, то multiprocessing.Pool - это то, что вам нужно. Он создает нескББиблиотека Python разработчика | Книги по питону10 полезных библиотек для Python-разработчика Сегодня я подготовил для вас подборку из 10 полезных библиотек, которые могут сделать вашу разработку проще и эффе
ББиблиотека Python разработчика | Книги по питонуБиблиотека Python разработчика | Книги по питону@BookPython · канал · Технологии
18 046подписчиков901средний охват поста
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем