Protocol или абстрактный класс
Вопрос
Чем typing.Protocol отличается от abc.ABC? Когда что выбрать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
ABC: номинальная типизация, нужно наследование или register
ABC проверяет абстрактные методы при создании экземпляра в рантайме
Protocol: структурная типизация, достаточно совпадения методов
Protocol удобен для сторонних классов и фейков в тестах
`@runtime_checkable` для isinstance, проверяет только наличие методов
Что могут спросить следом
- Может ли класс-протокол содержать реализацию методов?
- Что проверит
isinstanceс runtime_checkable протоколом?
Разбор
Образцовый ответ: «ABC это номинальная типизация: класс считается реализацией, только если явно наследует абстрактный класс или зарегистрирован через register. Плюс ABC работает во время выполнения: нельзя создать экземпляр, пока не реализованы все @abstractmethod, это ловит забытые методы. Protocol это структурная типизация для статического анализатора: подходит любой класс с нужными методами и сигнатурами, наследоваться не надо. Поэтому протокол удобен, когда реализацию я не контролирую, например сторонний клиент, или когда хочу в тестах подсунуть простой фейк. ABC выбираю, когда строю иерархию внутри своего кода и хочу общую реализацию в базовом классе плюс рантайм-гарантию. Protocol можно сделать @runtime_checkable, тогда работает isinstance, но он проверяет только наличие атрибутов, а не сигнатуры».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.