Что такое Protocol и когда он полезен?
Концепция протоколов в Python представляет собой элегантную реализацию структурной типизации, которую часто называют утиной типизацией со статической проверкой. В традиционном объектно-ориентированном программировании для использования полиморфизма классы должны явно наследовать от общего базового класса или интерфейса. Протоколы полностью меняют эту парадигму, позволяя определять требования к объекту на основе наличия у него определенных методов и атрибутов, независимо от его реального места в иерархии классов.
Для создания собственного протокола достаточно импортировать базовый класс из модуля typing и описать сигнатуру нужных методов. Например, вы можете создать интерфейс с методом read, и любой класс в вашей программе автоматически станет соответствовать этому протоколу, если у него есть метод с точно таким же именем и подходящими аргументами. При этом классам-участникам совершенно не нужно явно указывать имя протокола в списке базовых классов, что избавляет разработчиков от жесткой связанности кода.
Эта языковая конструкция оказывается незаменимой в целом ряде практических сценариев разработки:
Использование протоколов доступно из коробки начиная с версии Python 3.8 через встроенный модуль typing, а для более старых проектов можно подключить стороннюю библиотеку typing_extensions. Это делает структурную типизацию мощнейшим инструментом для архитекторов ПО, стремящихся писать расширяемый, тестируемый и чистый код без лишней бюрократии в иерархии классов.