December 26, 2019

Абстрактный класс и модуль ABC

Сегодня мы еще раз затронем тему абстрактных классов. В прошлый раз, чтобы создать абстрактный класс от которого будут наследоваться другие классы и которые будут обязаны переопределять методы определенные в абстрактном классе мы использовали обычный класс и для того, чтобы запретить вызов методов в таком классе мы возбуждали ошибки с помощью ключевого слова raise. Но у нас есть и другая возможность объявлять абстрактные классы. Этот способ несколько более красивый и продвинутый, он операется на специальный модуль и декоратор, который предназначен для того, чтобы определять абстрактные классы. Этот модуль называется ABC, что означает - Abstract Base Class. Посмотрим, как мы можем им воспользоваться:

Создадим новый класс, который будет наследовать наш абстрактный класс:

Для того, чтобы продемонстрировать то, что мы не можем создать инстанцию класса Triangle, который наследуется от абстрактного класса не переопределяя абсолютно все абстрактные методы мы закомментируем периметр и вот, что сделаем дальше:

Мы получили TypeError, потому что нельзя прописывать класс, который наследуется от абстрактного класса не переопределив все абстрактные методы. Соответственно, если мы вернем реализацию и пересоздадим, то получи