Найти в Дзене
Simple Prog

Что такое абстрактные классы? ООП в Python

Абстрактные классы (АК), иногда также называемые абстрактными базовыми классами, гарантируют, что производные классы реализуют те или иные методы базового класса. В этой статье вы узнаете о преимуществах абстрактных классов и о том, как их определять при помощи встроенного метода abc. Итак, в чем же прелесть абстрактных классов? Не так давно у меня на работе был спор о том, какой шаблон использовать для реализации удобной в сопровождении иерархии классов в Python. У нас был класс BaseService, который определял общий интерфейс и несколько конкретных реализаций. Конкретные реализации делают разные вещи, но все они обеспечивают тот же самый интерфейс. Чтобы более четко проявить взаимосвязи, все конкретные реализации были производными от класса BaseServise. Чтобы сделать этот программный код максимально удобным в обслуживании и благоприятным для программиста, мы хотели удостовериться, что Итак, почему же может возникнуть потребность в использовании модуля Python abc для решения этой задачи

Абстрактные классы (АК), иногда также называемые абстрактными базовыми классами, гарантируют, что производные классы реализуют те или иные методы базового класса. В этой статье вы узнаете о преимуществах абстрактных классов и о том, как их определять при помощи встроенного метода abc.

Источник: pythonchik.ru
Источник: pythonchik.ru

Итак, в чем же прелесть абстрактных классов? Не так давно у меня на работе был спор о том, какой шаблон использовать для реализации удобной в сопровождении иерархии классов в Python.

У нас был класс BaseService, который определял общий интерфейс и несколько конкретных реализаций. Конкретные реализации делают разные вещи, но все они обеспечивают тот же самый интерфейс. Чтобы более четко проявить взаимосвязи, все конкретные реализации были производными от класса BaseServise.

Чтобы сделать этот программный код максимально удобным в обслуживании и благоприятным для программиста, мы хотели удостовериться, что

  • создание экземпляров базового класса невозможно,
  • упущение из виду реализации методов интерфейса в одном из подклассов вызывает ошибку на ранней стадии.

Итак, почему же может возникнуть потребность в использовании модуля Python abc для решения этой задачи? Названная выше конструкция довольно распространена в более сложных системах. Чтобы обеспечить реализацию ряда методов базового класса производным классом, как правило, используется такая идиома Python:

Итак, что же мы получили из этой первой попытки решения задачи? Вызов методов экземпляра Base правильно вызывает исключения NotImplementedError:

Более того, и создание экземпляра, и использование Concrete работают, как и ожидалось. И если вызвать не реализованный в нем метод, такой как bar(), то в результате тоже будет вызвано исключение:

Эта первая реализация выглядит неплохо, но пока не идеально. Ее оборотными сторонами является то, что мы по-прежнему можем

  • легко создавать экземпляры класса Base, не получая ошибку, а также
  • обеспечивать неполные подклассы — создание экземпляра Concrete не будет вызывать ошибку до тех пор, пока мы не вызовем отсутствующий метод bar().

При помощи модуля Python abc, который был добавлен в Python 2.6, мы можем добиться большего успеха и решить эти оставшиеся проблемы. Вот обновленная реализация с использованием абстрактного класса, определенного в модуле abc:

Этот фрагмент кода по-прежнему ведет себя так, как нужно, и создает правильную иерархию классов:

assert issubclass(Concrete, Base)

С другой стороны, мы здесь получаем еще одно преимущество. Подклассы Base вызывают исключение TypeError во время создания экземпляра всякий раз, когда мы забываем реализовать какие-либо абстрактные методы. Вызванное исключение говорит о том, какой метод или методы отсутствуют:

Без модуля abc мы получали бы только исключение NotImplementedError в случае фактического вызова отсутствующего метода. Возможность получать уведомления об отсутствующих методах во время создания экземпляра является большим преимуществом.

В результате написание недопустимых экземпляров в значительной степени блокируется. Возможно, этот факт не сыграет особой роли, если вы пишете новый код, но обещаю, что спустя несколько недель или месяцев он станет полезным.

Фото автора.
Фото автора.

Понравилась статья? Не забудь подписаться и оставить свое мнение в комментариях, обязательно прочту и отвечу.

Читайте также: