Ответ вслух Senior Типизация обновлено

Protocol или абстрактный класс

Вопрос

Чем typing.Protocol отличается от abc.ABC? Когда что выбрать?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «ABC это номинальная типизация: класс считается реализацией, только если явно наследует абстрактный класс или зарегистрирован через register. Плюс ABC работает во время выполнения: нельзя создать экземпляр, пока не реализованы все @abstractmethod, это ловит забытые методы.

Что должно прозвучать в ответе

  • ABC: номинальная типизация, нужно наследование или register

  • ABC проверяет абстрактные методы при создании экземпляра в рантайме

  • Protocol: структурная типизация, достаточно совпадения методов

  • Protocol удобен для сторонних классов и фейков в тестах

  • `@runtime_checkable` для isinstance, проверяет только наличие методов

Что могут спросить следом

  • Может ли класс-протокол содержать реализацию методов?
  • Что проверит isinstance с runtime_checkable протоколом?

Разбор

Образцовый ответ: «ABC это номинальная типизация: класс считается реализацией, только если явно наследует абстрактный класс или зарегистрирован через register. Плюс ABC работает во время выполнения: нельзя создать экземпляр, пока не реализованы все @abstractmethod, это ловит забытые методы. Protocol это структурная типизация для статического анализатора: подходит любой класс с нужными методами и сигнатурами, наследоваться не надо. Поэтому протокол удобен, когда реализацию я не контролирую, например сторонний клиент, или когда хочу в тестах подсунуть простой фейк. ABC выбираю, когда строю иерархию внутри своего кода и хочу общую реализацию в базовом классе плюс рантайм-гарантию. Protocol можно сделать @runtime_checkable, тогда работает isinstance, но он проверяет только наличие атрибутов, а не сигнатуры».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.