Чем абстрактный класс в Python отличается от обычного

Ответ

Абстрактный класс — это класс, который не может быть инстанциирован (нельзя создать его объект) и предназначен для определения общего интерфейса (контракта) для своих подклассов. Он заставляет дочерние классы реализовывать определенные методы.

Ключевые отличия:

  • Инстанцирование: Нельзя создать объект абстрактного класса напрямую. Объект обычного класса создать можно.
  • Абстрактные методы: Абстрактный класс может содержать методы, помеченные декоратором @abstractmethod, у которых нет реализации. Подклассы обязаны их реализовать, иначе они тоже станут абстрактными.
  • Назначение: Служит в качестве шаблона или контракта для группы классов. Обычный класс представляет конкретную сущность.

Для создания абстрактных классов в Python используется модуль abc (Abstract Base Classes).

Пример:

from abc import ABC, abstractmethod

# Абстрактный класс определяет контракт: "любая фигура должна иметь метод для расчета площади"
class AbstractShape(ABC):
    @abstractmethod
    def area(self) -> float:
        # Нет реализации, только объявление
        pass

# Конкретный класс, реализующий контракт
class Square(AbstractShape):
    def __init__(self, side: float):
        self.side = side

    def area(self) -> float:
        return self.side * self.side

# Другой конкретный класс
class Circle(AbstractShape):
    def __init__(self, radius: float):
        self.radius = radius

    def area(self) -> float:
        return 3.14159 * self.radius ** 2

# Попытка создать экземпляр абстрактного класса вызовет TypeError
# shape = AbstractShape() # -> TypeError: Can't instantiate abstract class...

# Экземпляры дочерних классов создаются успешно
square = Square(5)
circle = Circle(3)

print(f"Площадь квадрата: {square.area()}")
print(f"Площадь круга: {circle.area()}")