Как в Python реализуются интерфейсы и когда их стоит использовать

Ответ

В Python концепция интерфейсов реализуется через абстрактные базовые классы (Abstract Base Classes, ABC) из модуля abc.

Они определяют «контракт» — набор методов, которые должен реализовать любой класс-наследник. Это позволяет вводить строгие правила в систему с динамической типизацией.

Основная цель — обеспечить полиморфизм и гарантировать, что объект имеет определённое поведение, не полагаясь только на «утиную типизацию».

Пример:

from abc import ABC, abstractmethod

# Определение интерфейса
class Serializable(ABC):
    @abstractmethod
    def serialize(self) -> str:
        """Сериализует объект в строку."""
        pass

# Конкретная реализация
class UserData(Serializable):
    def __init__(self, name: str, email: str):
        self.name = name
        self.email = email

    def serialize(self) -> str:
        import json
        return json.dumps({"name": self.name, "email": self.email})

# Попытка создать класс без реализации метода вызовет TypeError
# class BrokenData(Serializable):
#     pass
# b = BrokenData() # -> TypeError: Can't instantiate abstract class ...

Когда использовать:

  • В больших проектах и фреймворках: для явного определения API и точек расширения (плагинов).
  • При работе в команде: чтобы гарантировать, что разные части системы будут совместимы.
  • Для проверки типов: статические анализаторы, такие как mypy, используют ABC для более строгой проверки кода.