abc (Abstract Base Classes) и декоратор @abstractmethod. Подклассы должны переопределить все абстрактные методы родительского класса, иначе они также будут считаться абстрактными и не смогут быть инстанцированы.
  
    
      from abc import ABC, abstractmethod
      class Shape(ABC):
          @abstractmethod
          def area(self):
              pass
      class Circle(Shape):
          def __init__(self, radius):
              self.radius = radius
          def area(self):
              return 3.14 * self.radius * self.radius
      # shape = Shape()  # Ошибка: нельзя создать экземпляр абстрактного класса
      circle = Circle(5)
      print(circle.area())
    
  
Абстрактный класс - это класс, который не может быть инстанцирован (то есть, нельзя создать его экземпляр напрямую). Он служит как чертёж или шаблон для других классов, которые наследуются от него.
Основная цель абстрактного класса - определить интерфейс (набор методов), который должен быть реализован в его подклассах. Некоторые методы в абстрактном классе могут быть абстрактными (не иметь реализации), другие - конкретными (иметь реализацию).
Как использовать абстрактные классы в наследовании:
Пример:
    
      import abc
      class Shape(abc.ABC):
          @abc.abstractmethod
          def area(self):
              pass
          @abc.abstractmethod
          def perimeter(self):
              pass
          def describe(self):
              return "This is a shape."
      class Circle(Shape):
          def __init__(self, radius):
              self.radius = radius
          def area(self):
              return 3.14 * self.radius * self.radius
          def perimeter(self):
              return 2 * 3.14 * self.radius
      class Square(Shape):
          def __init__(self, side):
              self.side = side
          def area(self):
              return self.side * self.side
          def perimeter(self):
              return 4 * self.side
      # Нельзя создать экземпляр Shape напрямую
      # shape = Shape()  # TypeError: Can't instantiate abstract class Shape with abstract methods area, perimeter
      circle = Circle(5)
      print(f"Circle area: {circle.area()}")
      print(f"Circle perimeter: {circle.perimeter()}")
      print(circle.describe())
      square = Square(4)
      print(f"Square area: {square.area()}")
      print(f"Square perimeter: {square.perimeter()}")
      print(square.describe())
    
  
  Преимущества использования абстрактных классов: