collections.abc.md
1> **Источник:** https://python-all.ru/3.9/library/collections.abc.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`collections.abc`](https://python-all.ru/3.9/library/collections.abc.html#module-collections.abc) – Абстрактные базовые классы для контейнеров89Новинка версии 3.3: Ранее этот модуль был частью модуля [`collections`](https://python-all.ru/3.9/library/collections.html#module-collections).1011**Исходный код:** [Lib/\_collections\_abc.py](https://python-all.ru/src/3.9/Lib/_collections_abc.py)1213---1415Этот модуль предоставляет [абстрактные базовые классы](https://python-all.ru/3.9/glossary.html#term-abstract-base-class), которые можно использовать для проверки, реализует ли класс определённый интерфейс; например, является ли он хешируемым или отображением.1617Новинка версии 3.9: Эти абстрактные классы теперь поддерживают `[]`. См. [Generic Alias Type](https://python-all.ru/3.9/library/stdtypes.html#types-genericalias) и [**PEP 585**](https://python-all.ru/3.9/library/collections.abc.html).1819## Абстрактные базовые классы коллекций2021Модуль collections предоставляет следующие [абстрактные базовые классы](https://python-all.ru/3.9/glossary.html#term-abstract-base-class):2223| ABC | Наследует от | Абстрактные методы | Методы-примеси |24| --- | --- | --- | --- |25| [`Container`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Container) | | `__contains__` | |26| [`Hashable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Hashable) | | `__hash__` | |27| [`Iterable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Iterable) | | `__iter__` | |28| [`Iterator`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Iterator) | [`Iterable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Iterable) | `__next__` | `__iter__` |29| [`Reversible`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Reversible) | [`Iterable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Iterable) | `__reversed__` | |30| [`Generator`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Generator) | [`Iterator`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Iterator) | `send`, `throw` | `close`, `__iter__`, `__next__` |31| [`Sized`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Sized) | | `__len__` | |32| [`Callable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Callable) | | `__call__` | |33| [`Collection`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Collection) | [`Sized`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Sized), [`Iterable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Iterable), [`Container`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Container) | `__contains__`, `__iter__`, `__len__` | |34| [`Sequence`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Sequence) | [`Reversible`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Reversible), [`Collection`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Collection) | `__getitem__`, `__len__` | `__contains__`, `__iter__`, `__reversed__`, `index` и `count` |35| [`MutableSequence`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.MutableSequence) | [`Sequence`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Sequence) | `__getitem__`, `__setitem__`, `__delitem__`, `__len__`, `insert` | Наследуемые методы [`Sequence`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Sequence) и `append`, `reverse`, `extend`, `pop`, `remove` и `__iadd__` |36| [`ByteString`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.ByteString) | [`Sequence`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Sequence) | `__getitem__`, `__len__` | Унаследованные методы [`Sequence`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Sequence) |37| [`Set`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Set) | [`Collection`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Collection) | `__contains__`, `__iter__`, `__len__` | `__le__`, `__lt__`, `__eq__`, `__ne__`, `__gt__`, `__ge__`, `__and__`, `__or__`, `__sub__`, `__xor__` и `isdisjoint` |38| [`MutableSet`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.MutableSet) | [`Set`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Set) | `__contains__`, `__iter__`, `__len__`, `add`, `discard` | Унаследованные методы [`Set`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Set) и `clear`, `pop`, `remove`, `__ior__`, `__iand__`, `__ixor__` и `__isub__` |39| [`Mapping`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Mapping) | [`Collection`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Collection) | `__getitem__`, `__iter__`, `__len__` | `__contains__`, `keys`, `items`, `values`, `get`, `__eq__` и `__ne__` |40| [`MutableMapping`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.MutableMapping) | [`Mapping`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Mapping) | `__getitem__`, `__setitem__`, `__delitem__`, `__iter__`, `__len__` | Унаследованные методы [`Mapping`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Mapping) и `pop`, `popitem`, `clear`, `update`, и `setdefault` |41| [`MappingView`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.MappingView) | [`Sized`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Sized) | | `__len__` |42| [`ItemsView`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.ItemsView) | [`MappingView`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.MappingView), [`Set`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Set) | | `__contains__`, `__iter__` |43| [`KeysView`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.KeysView) | [`MappingView`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.MappingView), [`Set`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Set) | | `__contains__`, `__iter__` |44| [`ValuesView`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.ValuesView) | [`MappingView`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.MappingView), [`Collection`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Collection) | | `__contains__`, `__iter__` |45| [`Awaitable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Awaitable) | | `__await__` | |46| [`Coroutine`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Coroutine) | [`Awaitable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Awaitable) | `send`, `throw` | `close` |47| [`AsyncIterable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.AsyncIterable) | | `__aiter__` | |48| [`AsyncIterator`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.AsyncIterator) | [`AsyncIterable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.AsyncIterable) | `__anext__` | `__aiter__` |49| [`AsyncGenerator`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.AsyncGenerator) | [`AsyncIterator`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.AsyncIterator) | `asend`, `athrow` | `aclose`, `__aiter__`, `__anext__` |5051#### `class collections.abc.Container`5253ABC для классов, которые предоставляют метод [`__contains__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__contains__).5455#### `class collections.abc.Hashable`5657ABC для классов, которые предоставляют метод [`__hash__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__hash__).5859#### `class collections.abc.Sized`6061ABC для классов, которые предоставляют метод [`__len__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__len__).6263#### `class collections.abc.Callable`6465ABC для классов, которые предоставляют метод [`__call__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__call__).6667#### `class collections.abc.Iterable`6869ABC для классов, которые предоставляют метод [`__iter__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__iter__).7071Проверка `isinstance(obj, Iterable)` обнаруживает классы, которые зарегистрированы как [`Iterable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Iterable) или имеют метод [`__iter__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__iter__), но она не обнаруживает классы, которые итерируются с помощью метода [`__getitem__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__getitem__). Единственный надёжный способ определить, является ли объект [итерируемым](https://python-all.ru/3.9/glossary.html#term-iterable), – вызвать `iter(obj)`.7273#### `class collections.abc.Collection`7475ABC для классов-контейнеров, которые поддерживают итерирование и определение размера.7677Новое в версии 3.6.7879#### `class collections.abc.Iterator`8081ABC для классов, которые предоставляют методы [`__iter__()`](https://python-all.ru/3.9/library/stdtypes.html#iterator.__iter__) и [`__next__()`](https://python-all.ru/3.9/library/stdtypes.html#iterator.__next__). См. также определение [итератора](https://python-all.ru/3.9/glossary.html#term-iterator).8283#### `class collections.abc.Reversible`8485ABC для итерируемых классов, которые также предоставляют метод [`__reversed__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__reversed__).8687Новое в версии 3.6.8889#### `class collections.abc.Generator`9091ABC для классов-генераторов, реализующих протокол, определённый в [**PEP 342**](https://python-all.ru/3.9/library/collections.abc.html), который расширяет итераторы методами [`send()`](https://python-all.ru/3.9/reference/expressions.html#generator.send), [`throw()`](https://python-all.ru/3.9/reference/expressions.html#generator.throw) и [`close()`](https://python-all.ru/3.9/reference/expressions.html#generator.close). См. также определение [генератора](https://python-all.ru/3.9/glossary.html#term-generator).9293Новое в версии 3.5.9495#### `class collections.abc.Sequence`9697#### `class collections.abc.MutableSequence`9899#### `class collections.abc.ByteString`100101ABC для неизменяемых и изменяемых [последовательностей](https://python-all.ru/3.9/glossary.html#term-sequence).102103Примечание к реализации: некоторые методы-примеси, такие как [`__iter__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__iter__), [`__reversed__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__reversed__) и `index()`, многократно вызывают базовый метод [`__getitem__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__getitem__). Следовательно, если метод [`__getitem__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__getitem__) реализован с постоянной скоростью доступа, методы-примеси будут иметь линейную производительность; однако, если базовый метод является линейным (как в случае со связным списком), производительность примесей станет квадратичной, и их, скорее всего, придётся переопределить.104105Изменено в версии 3.5: Метод index() получил поддержку *stop* и *start* аргументов.106107#### `class collections.abc.Set`108109#### `class collections.abc.MutableSet`110111ABC для наборов только для чтения и изменяемых наборов.112113#### `class collections.abc.Mapping`114115#### `class collections.abc.MutableMapping`116117ABC для неизменяемых и изменяемых [отображений](https://python-all.ru/3.9/glossary.html#term-mapping).118119#### `class collections.abc.MappingView`120121#### `class collections.abc.ItemsView`122123#### `class collections.abc.KeysView`124125#### `class collections.abc.ValuesView`126127ABC для [представлений](https://python-all.ru/3.9/glossary.html#term-dictionary-view) отображений, элементов, ключей и значений.128129#### `class collections.abc.Awaitable`130131ABC для [ожидаемых](https://python-all.ru/3.9/glossary.html#term-awaitable) объектов, которые могут использоваться в выражениях [`await`](https://python-all.ru/3.9/reference/expressions.html#await). Пользовательские реализации должны предоставлять метод [`__await__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__await__) .132133Объекты [Coroutine](https://python-all.ru/3.9/glossary.html#term-coroutine) и экземпляры ABC [`Coroutine`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Coroutine) являются экземплярами этого ABC.134135> **Примечание**136>137> В CPython корутины на основе генераторов (генераторы, декорированные [`types.coroutine()`](https://python-all.ru/3.9/library/types.html#types.coroutine) или [`asyncio.coroutine()`](https://python-all.ru/3.9/library/asyncio-task.html#asyncio.coroutine)) являются *ожидаемыми объектами*, даже если у них нет метода [`__await__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__await__). Использование `isinstance(gencoro, Awaitable)` для них вернёт `False`. Используйте [`inspect.isawaitable()`](https://python-all.ru/3.9/library/inspect.html#inspect.isawaitable) для их обнаружения.138139Новое в версии 3.5.140141#### `class collections.abc.Coroutine`142143ABC для классов, совместимых с корутинами. Они реализуют следующие методы, определённые в [Объектах корутин](https://python-all.ru/3.9/reference/datamodel.html#coroutine-objects): [`send()`](https://python-all.ru/3.9/reference/datamodel.html#coroutine.send), [`throw()`](https://python-all.ru/3.9/reference/datamodel.html#coroutine.throw) и [`close()`](https://python-all.ru/3.9/reference/datamodel.html#coroutine.close). Пользовательские реализации также должны реализовывать [`__await__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__await__). Все экземпляры [`Coroutine`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Coroutine) также являются экземплярами [`Awaitable`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Awaitable). См. также определение [корутины](https://python-all.ru/3.9/glossary.html#term-coroutine).144145> **Примечание**146>147> В CPython корутины на основе генераторов (генераторы, декорированные [`types.coroutine()`](https://python-all.ru/3.9/library/types.html#types.coroutine) или [`asyncio.coroutine()`](https://python-all.ru/3.9/library/asyncio-task.html#asyncio.coroutine)) являются *ожидаемыми объектами*, даже если у них нет метода [`__await__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__await__). Использование `isinstance(gencoro, Coroutine)` для них вернёт `False`. Используйте [`inspect.isawaitable()`](https://python-all.ru/3.9/library/inspect.html#inspect.isawaitable) для их обнаружения.148149Новое в версии 3.5.150151#### `class collections.abc.AsyncIterable`152153ABC для классов, предоставляющих метод `__aiter__`. См. также определение [асинхронного итерируемого](https://python-all.ru/3.9/glossary.html#term-asynchronous-iterable).154155Новое в версии 3.5.156157#### `class collections.abc.AsyncIterator`158159ABC для классов, предоставляющих методы `__aiter__` и `__anext__`. См. также определение [асинхронного итератора](https://python-all.ru/3.9/glossary.html#term-asynchronous-iterator).160161Новое в версии 3.5.162163#### `class collections.abc.AsyncGenerator`164165ABC для классов асинхронных генераторов, реализующих протокол, определённый в [**PEP 525**](https://python-all.ru/3.9/library/collections.abc.html) и [**PEP 492**](https://python-all.ru/3.9/library/collections.abc.html).166167Новое в версии 3.6.168169Эти ABC позволяют проверять, предоставляют ли классы или их экземпляры определённую функциональность, например:170171```python172size = None173if isinstance(myvar, collections.abc.Sized):174 size = len(myvar)175```176177Некоторые из ABC также полезны в качестве примесей (mixins), упрощающих разработку классов, поддерживающих API контейнеров. Например, чтобы написать класс, поддерживающий полный API [`Set`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Set), достаточно предоставить три основных абстрактных метода: [`__contains__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__contains__), [`__iter__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__iter__) и [`__len__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__len__). ABC предоставляет остальные методы, такие как [`__and__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__and__) и `isdisjoint()`:178179```python180class ListBasedSet(collections.abc.Set):181 ''' Альтернативная реализация множества, ориентированная на экономию памяти, а не на скорость182 и не требующая, чтобы элементы множества были хэшируемыми. '''183 def __init__(self, iterable):184 self.elements = lst = []185 for value in iterable:186 if value not in lst:187 lst.append(value)188189 def __iter__(self):190 return iter(self.elements)191192 def __contains__(self, value):193 return value in self.elements194195 def __len__(self):196 return len(self.elements)197198s1 = ListBasedSet('abcdef')199s2 = ListBasedSet('defghi')200overlap = s1 & s2 # Метод __and__() поддерживается автоматически201```202203Замечания по использованию [`Set`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Set) и [`MutableSet`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.MutableSet) в качестве примеси:2042051. Поскольку некоторые операции над множествами создают новые множества, методам примеси по умолчанию нужен способ создавать новые экземпляры из итерируемого объекта. Предполагается, что конструктор класса имеет сигнатуру вида `ClassName(iterable)`. Это предположение вынесено во внутренний метод класса, называемый `_from_iterable()`, который вызывает `cls(iterable)` для создания нового множества. Если примесь [`Set`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Set) используется в классе с другой сигнатурой конструктора, потребуется переопределить `_from_iterable()` методом класса или обычным методом, который может создавать новые экземпляры из итерируемого аргумента.2062. Чтобы переопределить сравнения (предположительно для скорости, так как семантика фиксирована), переопределите [`__le__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__le__) и [`__ge__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__ge__), тогда остальные операции будут автоматически им следовать.2073. Миксин [`Set`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Set) предоставляет метод `_hash()` для вычисления хеша множества; однако [`__hash__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__hash__) не определён, так как не все множества хешируемы или неизменяемы. Чтобы добавить хешируемость множества с помощью миксинов, унаследуйте от обоих [`Set()`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Set) и [`Hashable()`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.Hashable), а затем определите `__hash__ = Set._hash`.208209> **См. также**210>211> - [Рецепт OrderedSet](https://python-all.ru/3.9/library/collections.abc.html) для примера, построенного на [`MutableSet`](https://python-all.ru/3.9/library/collections.abc.html#collections.abc.MutableSet).212> - Для получения дополнительной информации об ABC см. модуль [`abc`](https://python-all.ru/3.9/library/abc.html#module-abc) и .213