Содержание страницы
8.4. collections.abc – Абстрактные базовые классы для контейнеров¶collections.abc – Abstract Base Classes for Containers
Новое в версии 3.3: Ранее этот модуль был частью модуля collections.
Исходный код: Lib/_collections_abc.py
Этот модуль предоставляет абстрактные базовые классы, которые можно использовать для проверки, реализует ли класс определённый интерфейс; например, является ли он хешируемым или отображением.
8.4.1. Абстрактные базовые классы коллекций¶Collections Abstract Base Classes
Модуль collections предоставляет следующие абстрактные базовые классы:
| ABC | Наследует от | Абстрактные методы | Методы-примеси |
|---|---|---|---|
| Container | __contains__ | ||
| Hashable | __hash__ | ||
| Iterable | __iter__ | ||
| Iterator | Iterable | __next__ | __iter__ |
| Sized | __len__ | ||
| Callable | __call__ | ||
| Sequence | Sized, Iterable, Container | __getitem__, __len__ | __contains__, __iter__, __reversed__, index и count |
| MutableSequence | Sequence | __getitem__, __setitem__, __delitem__, __len__, insert | Унаследованные методы Sequence и append, reverse, extend, pop, remove и __iadd__ |
| Set | Sized, Iterable, Container | __contains__, __iter__, __len__ | __le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__, __sub__, __xor__ и isdisjoint |
| MutableSet | Set | __contains__, __iter__, __len__, add, discard | Унаследованные Set методы и clear, pop, remove, __ior__, __iand__, __ixor__ и __isub__ |
| Mapping | Sized, Iterable, Container | __getitem__, __iter__, __len__ | __contains__, keys, items, values, get, __eq__ и __ne__ |
| MutableMapping | Mapping | __getitem__, __setitem__, __delitem__, __iter__, __len__ | Унаследованные Mapping методы и pop, popitem, clear, update, и setdefault |
| MappingView | Sized | __len__ | |
| ItemsView | MappingView, Set | __contains__, __iter__ | |
| KeysView | MappingView, Set | __contains__, __iter__ | |
| ValuesView | MappingView | __contains__, __iter__ |
- class collections.abc.Container¶
- class collections.abc.Hashable¶
- class collections.abc.Sized¶
- class collections.abc.Callable¶
Абстрактные базовые классы (ABC) для классов, предоставляющих соответственно методы __contains__(), __hash__(), __len__() и __call__().
- class collections.abc.Iterable¶
ABC для классов, предоставляющих метод __iter__(). См. также определение итерируемого объекта.
- class collections.abc.Iterator¶
ABC для классов, предоставляющих методы __iter__() и __next__(). См. также определение итератора.
- class collections.abc.Sequence¶
- class collections.abc.MutableSequence¶
ABC для неизменяемых и изменяемых последовательностей.
- class collections.abc.Set¶
- class collections.abc.MutableSet¶
ABC для наборов только для чтения и изменяемых наборов.
- class collections.abc.Mapping¶
- class collections.abc.MutableMapping¶
ABC для неизменяемых и изменяемых отображений.
- class collections.abc.MappingView¶
- class collections.abc.ItemsView¶
- class collections.abc.KeysView¶
- class collections.abc.ValuesView¶
ABC для представлений отображений, элементов, ключей и значений.
Эти ABC позволяют проверять, предоставляют ли классы или их экземпляры определённую функциональность, например:
size = None
if isinstance(myvar, collections.abc.Sized):
size = len(myvar)
Некоторые из ABC также полезны в качестве миксинов, упрощающих разработку классов, поддерживающих API контейнеров. Например, чтобы написать класс, поддерживающий полный API Set, достаточно предоставить три базовых абстрактных метода: __contains__(), __iter__() и __len__(). ABC предоставляет остальные методы, такие как __and__() и isdisjoint():
class ListBasedSet(collections.abc.Set):
''' Альтернативная реализация множества, ориентированная на экономию памяти, а не на скорость
и не требующая, чтобы элементы множества были хэшируемыми. '''
def __init__(self, iterable):
self.elements = lst = []
for value in iterable:
if value not in lst:
lst.append(value)
def __iter__(self):
return iter(self.elements)
def __contains__(self, value):
return value in self.elements
def __len__(self):
return len(self.elements)
s1 = ListBasedSet('abcdef')
s2 = ListBasedSet('defghi')
overlap = s1 & s2 # Метод __and__() поддерживается автоматически
Замечания по использованию Set и MutableSet в качестве миксина:
- Поскольку некоторые операции над множествами создают новые множества, методам миксина по умолчанию требуется способ создавать новые экземпляры из итерируемого объекта. Предполагается, что конструктор класса имеет сигнатуру вида ClassName(iterable). Это предположение вынесено во внутренний метод класса _from_iterable(), который вызывает cls(iterable) для создания нового множества. Если миксин Set используется в классе с другой сигнатурой конструктора, потребуется переопределить _from_iterable() методом класса, который сможет создавать новые экземпляры из итерируемого аргумента.
- Чтобы переопределить операции сравнения (предположительно ради скорости, так как семантика фиксирована), переопределите __le__() и __ge__(), тогда остальные операции автоматически будут вести себя аналогично.
- Миксин Set предоставляет метод _hash() для вычисления хеш-значения множества; однако __hash__() не определён, поскольку не все множества являются хешируемыми или неизменяемыми. Чтобы добавить хешируемость множеству с помощью миксинов, унаследуйте как от Set(), так и от Hashable(), затем определите __hash__ = Set._hash.
См. также
- Рецепт OrderedSet для примера, построенного на основе MutableSet.
- Для получения дополнительной информации об ABC см. модуль abc и PEP 3119.