Что такое абстрактный класс в Python
Что проверяют
Знаете ли вы механизм и понимаете ли, когда уместнее протокол.
Как отвечать
Абстрактный класс задаёт контракт для наследников: объявляет методы, которые они обязаны реализовать, и может содержать общую реализацию.
Реализуется через модуль абстрактных базовых классов: наследование от специального базового класса и декоратор на методах.
from abc import ABC, abstractmethod
class Storage(ABC):
@abstractmethod
def save(self, key: str, data: bytes) -> None: ...
def save_text(self, key: str, text: str) -> None: # общая реализация
self.save(key, text.encode())Ключевое свойство: создать экземпляр класса с нереализованными абстрактными методами нельзя, ошибка возникает при попытке создания. Это ловит ситуацию, когда наследник забыл что-то реализовать.
Абстрактными могут быть не только методы, но и свойства, а также методы класса и статические.
Дальше стоит сказать про альтернативу, потому что в современном коде она часто уместнее. Протокол описывает требуемый набор методов без наследования: любой класс с подходящими методами считается совместимым. Это структурная типизация, соответствующая духу языка, где важно поведение объекта, а не его происхождение.
Когда что выбирать:
- абстрактный класс, когда нужна общая реализация для наследников или проверка во время выполнения;
- протокол, когда нужен только контракт, особенно если реализации вам не принадлежат. Чужой класс из библиотеки нельзя заставить наследоваться, а протоколу он может соответствовать автоматически.
Полезная деталь: абстрактный класс проверяет соответствие в момент создания объекта, а протокол проверяется статическим анализатором на этапе разработки и по умолчанию ничего не проверяет во время выполнения.
Где спотыкаются
Наследуют от обычного класса и просто бросают исключение в методах.
Считают, что декоратор сам по себе запрещает создание объекта без наследования от абстрактного базового класса.
Не знают про протоколы и заставляют чужие классы наследоваться.
Кладут в абстрактный класс состояние, превращая контракт в базовый класс с логикой.