Что такое ABC (Abstract Base Classes)?python-34

Абстрактные базовые классы (ABC) - это механизм Python для создания строгих интерфейсов и обеспечения соблюдения контрактов в иерархии классов. Они определены в модуле abc стандартной библиотеки.

Основная концепция

ABC позволяют:

  1. Определять абстрактные методы (методы без реализации)
  2. Запрещать создание экземпляров класса, пока все абстрактные методы не реализованы
  3. Создавать формальные интерфейсы для групп связанных классов

Простейший пример:

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self) -> float:
        pass

    @abstractmethod
    def perimeter(self) -> float:
        pass

Ключевые компоненты

1. Декоратор @abstractmethod

Помечает метод как абстрактный - подклассы обязаны его реализовать:

class DatabaseConnector(ABC):
    @abstractmethod
    def connect(self):
        pass

    @abstractmethod
    def execute_query(self, query: str):
        pass

2. Метод register

Позволяет зарегистрировать класс как виртуальный подкласс без наследования:

class MyDatabase:
    def connect(self):
        print("Connecting...")

DatabaseConnector.register(MyDatabase)  # Теперь issubclass(MyDatabase, DatabaseConnector) == True

3. Комбинация с другими декораторами

ABC можно комбинировать с @property, @classmethod и др.:

class Sensor(ABC):
    @property
    @abstractmethod
    def reading(self) -> float:
        pass

Практическое применение

1. Проверка реализации

Попытка создать экземпляр без реализации всех абстрактных методов вызовет TypeError:

class Circle(Shape):
    def __init__(self, radius: float):
        self.radius = radius

# TypeError: Can't instantiate abstract class Circle with abstract methods area, perimeter

2. Создание plugin-архитектур

Определение четкого API для плагинов:

class TextProcessor(ABC):
    @abstractmethod
    def process(self, text: str) -> str:
        pass

class UpperProcessor(TextProcessor):
    def process(self, text: str) -> str:
        return text.upper()

3. Встроенные ABC

Python предоставляет полезные ABC в модуле collections.abc:

from collections.abc import Sequence, MutableMapping

class CustomList(Sequence):
    def __init__(self, data):
        self.data = list(data)

    def __getitem__(self, index):
        return self.data[index]

    def __len__(self):
        return len(self.data)

Продвинутые техники

1. Абстрактные свойства

class Vehicle(ABC):
    @property
    @abstractmethod
    def max_speed(self) -> float:
        pass

class Car(Vehicle):
    def __init__(self):
        self._max_speed = 180.0

    @property
    def max_speed(self) -> float:
        return self._max_speed

2. Абстрактные классовые методы

class Model(ABC):
    @classmethod
    @abstractmethod
    def from_json(cls, json_data: dict):
        pass

Ограничения

  • Не заменяют полноценные интерфейсы как в статически типизированных языках
  • Проверка происходит только при создании экземпляра, а не при определении класса
  • Нет поддержки абстрактных статических методов (используйте обычные методы)

Резюмируем

ABC полезны для:

  1. Создания строгих интерфейсов
  2. Обеспечения контракта реализации
  3. Построения plugin-систем
  4. Документирования ожидаемого поведения классов

Пример с подсветкой (как в VSCode):

from abc import ABC, abstractmethod
from typing import Iterable

class DataExporter(ABC):
    @abstractmethod
    def export(self, data: Iterable[dict]) -> bool:
        """Экспортирует данные во внешнюю систему"""
        pass

    @property
    @abstractmethod
    def format_name(self) -> str:
        """Возвращает название формата экспорта"""
        pass