Ответ
collections.abc
— это модуль в стандартной библиотеке Python, который предоставляет абстрактные базовые классы (Abstract Base Classes, ABCs). Они определяют общие интерфейсы для стандартных типов коллекций, таких как списки, словари и множества.
Основное назначение:
- Определение контрактов: ABCs позволяют создавать собственные классы-коллекции, которые гарантированно поддерживают стандартные операции (например, итерацию, получение длины, доступ по индексу).
- Проверка типов: С помощью
isinstance()
можно проверить, реализует ли объект определенный интерфейс, даже если он не наследуется напрямую от ABC.
Ключевые абстрактные классы:
Iterable
: Объект, который можно перебирать (реализует__iter__
).Sized
: Объект, у которого можно узнать размер (реализует__len__
).Container
: Объект, который поддерживает проверку на вхождение с помощьюin
(реализует__contains__
).Sequence
: Неизменяемая последовательность (какtuple
).MutableSequence
: Изменяемая последовательность (какlist
).Mapping
: Отображение "ключ-значение" (какdict
).
Пример реализации MutableSequence
:
Чтобы создать собственный класс, ведущий себя как список, нужно унаследовать его от collections.abc.MutableSequence
и реализовать несколько обязательных (абстрактных) методов. Остальные методы (append
, reverse
, extend
и др.) будут унаследованы автоматически.
from collections.abc import MutableSequence
class CustomList(MutableSequence):
def __init__(self, initial_data=None):
self._data = list(initial_data) if initial_data is not None else []
# --- Обязательные методы для реализации ---
def __getitem__(self, index):
return self._data[index]
def __setitem__(self, index, value):
self._data[index] = value
def __delitem__(self, index):
del self._data[index]
def __len__(self):
return len(self._data)
def insert(self, index, value):
self._data.insert(index, value)
def __str__(self):
return str(self._data)
# Теперь наш класс поддерживает все методы списка
my_list = CustomList([1, 2, 3])
my_list.append(4)
print(my_list) # Вывод: [1, 2, 3, 4]
my_list.reverse()
print(my_list) # Вывод: [4, 3, 2, 1]
Использование collections.abc
помогает писать более надежный и предсказуемый код, соответствующий стандартным интерфейсам Python.