Что такое абстрактный класс в Python (ABC, abstractmethod) и зачем он?
Хочу задать «интерфейс»: базовый класс, у которого есть метод, но реализации нет, и чтобы наследник был обязан его реализовать — иначе ошибка. Как это сделать в Python? Видел ABC и @abstractmethod.
2 ответа
Абстрактный класс — это базовый класс, который нельзя инстанцировать напрямую и который заставляет наследников реализовать определённые методы. Делается через модуль abc:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
...
class Circle(Shape):
def __init__(self, r):
self.r = r
def area(self):
return 3.14 * self.r ** 2
Shape() # TypeError: Can't instantiate abstract class
Circle(5).area() # 78.5 — ок
Если наследник не реализует area, при попытке создать его объект Python кинет TypeError. Это и есть смысл: ABC задаёт «контракт» — что обязан уметь любой потомок. Полезно в больших проектах, чтобы гарантировать единый интерфейс у группы классов (все «фигуры» точно имеют area).
Наследуешь от ABC, помечаешь метод @abstractmethod. Создать объект класса с нереализованным абстрактным методом нельзя — будет TypeError. Так задаётся обязательный интерфейс для наследников.