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
    
  
  Circle должен реализовать метод area, иначе будет ошибка.
Абстрактные классы в Python (используются через модуль abc) позволяют определить общую структуру (интерфейс) для группы классов, не реализуя всю логику внутри абстрактного класса. Они служат шаблонами, которые предписывают подклассам реализовать определенные методы. Вот как их можно использовать для создания общей структуры и расширения объектов:
        Импортируем модуль abc и используем ABCMeta в качестве метакласса и декоратор @abstractmethod для указания абстрактных методов. Абстрактные методы не имеют реализации в абстрактном классе и должны быть реализованы в его подклассах.
      
        
import abc
class AbstractShape(abc.ABC):
    @abc.abstractmethod
    def area(self):
        pass
    @abc.abstractmethod
    def perimeter(self):
        pass
    def describe(self):
        return "Это абстрактная фигура."
        
      
    
        Классы, наследующие от абстрактного класса, должны реализовать все абстрактные методы. Если хотя бы один абстрактный метод не реализован, при попытке создать экземпляр подкласса будет вызвано исключение TypeError.
      
        
class Circle(AbstractShape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        return 3.14159 * self.radius * self.radius
    def perimeter(self):
        return 2 * 3.14159 * self.radius
    def describe(self):
        return f"Это круг с радиусом {self.radius}."
class Square(AbstractShape):
    def __init__(self, side):
        self.side = side
    def area(self):
        return self.side * self.side
    def perimeter(self):
        return 4 * self.side
    def describe(self):
        return f"Это квадрат со стороной {self.side}."
# Пример использования:
circle = Circle(5)
square = Square(4)
print(circle.area())       # Вывод: 78.53975
print(square.perimeter())   # Вывод: 16
print(circle.describe())  # Вывод: Это круг с радиусом 5.
print(square.describe())  # Вывод: Это квадрат со стороной 4.
        
      
    
    В примере выше, AbstractShape определяет общую структуру для всех фигур.  Классы Circle и Square наследуются от него и реализуют абстрактные методы area и perimeter, определяя специфическую логику для каждой фигуры.  Метод describe предоставляется как реализация по умолчанию, но может быть переопределен в подклассах. Это позволяет создать расширяемую и хорошо структурированную иерархию классов.