Вопрос проверяет понимание механизма абстрактных классов и принципов проектирования интерфейсов.
Абстрактные классы не позволяют создать объект, пока не реализованы все обязательные методы. Это предотвращает ошибки на этапе выполнения. При использовании NotImplementedError ошибка возникает только при вызове метода. Абстрактные классы делают контракт класса более явным.
В Python есть два подхода к созданию базовых классов с обязательными методами.
Пример:
class Base:
def process(self):
raise NotImplementedError
Недостатки:
Объект можно создать
Ошибка появится только при вызове метода
Это может привести к ошибкам в продакшене.
Определение:
Абстрактный класс — это класс, который нельзя создать, пока не реализованы все абстрактные методы.
Пример:
from abc import ABC, abstractmethod
class Base(ABC):
@abstractmethod
def process(self):
pass
Если попытаться создать объект:
Base() # TypeError
Основные плюсы:
Ошибка возникает раньше
Четкий контракт интерфейса
Удобство поддержки
Рекомендуется:
В библиотеках
В архитектуре сервисов
В крупных проектах
Абстрактные классы безопаснее и яснее, чем выбрасывание NotImplementedError, потому что предотвращают создание неполноценных объектов и явно фиксируют контракт класса.