collections.abc.md
1> **Источник:** https://python-all.ru/3.15/library/collections.abc.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `collections.abc` – Абстрактные базовые классы для контейнеров89Добавлено в версии 3.3: Ранее этот модуль был частью модуля [`collections`](https://python-all.ru/3.15/library/collections.html#module-collections).1011**Исходный код:** [Lib/\_collections\_abc.py](https://python-all.ru/src/3.15/Lib/_collections_abc.py)1213---1415Этот модуль предоставляет [абстрактные базовые классы](https://python-all.ru/3.15/glossary.html#term-abstract-base-class), которые можно использовать для проверки, предоставляет ли класс определённый интерфейс; например, является ли он [хешируемым](https://python-all.ru/3.15/glossary.html#term-hashable) или [отображением](https://python-all.ru/3.15/glossary.html#term-mapping).1617Проверка [`issubclass()`](https://python-all.ru/3.15/library/functions.html#issubclass) или [`isinstance()`](https://python-all.ru/3.15/library/functions.html#isinstance) для интерфейса работает одним из трёх способов.18191. Новый класс может наследовать напрямую от одного из абстрактных базовых классов. Класс должен предоставлять требуемые абстрактные методы. Остальные методы-примеси наследуются и могут быть переопределены при необходимости. Другие методы могут быть добавлены по мере необходимости:2021 ```python22 class C(Sequence): # Прямое наследование23 def __init__(self): ... # Дополнительный метод, не требуемый ABC24 def __getitem__(self, index): ... # Обязательный абстрактный метод25 def __len__(self): ... # Обязательный абстрактный метод26 def count(self, value): ... # Необязательное переопределение метода-примеси27 ```2829 ```pycon30 >>> issubclass(C, Sequence)31 True32 >>> isinstance(C(), Sequence)33 True34 ```352. Существующие и встроенные классы могут быть зарегистрированы как «виртуальные подклассы» ABC. Эти классы должны определять полный API, включая все абстрактные методы и все методы-примеси. Это позволяет пользователям полагаться на проверки [`issubclass()`](https://python-all.ru/3.15/library/functions.html#issubclass) или [`isinstance()`](https://python-all.ru/3.15/library/functions.html#isinstance), чтобы определить, поддерживается ли полный интерфейс. Исключением из этого правила являются методы, которые автоматически выводятся из остального API:3637 ```python38 class D: # Нет наследования39 def __init__(self): ... # Дополнительный метод, не требуемый ABC40 def __getitem__(self, index): ... # Обязательный абстрактный метод41 def __len__(self): ... # Обязательный абстрактный метод42 def count(self, value): ... # Метод-примесь43 def index(self, value): ... # Метод-примесь4445 Sequence.register(D) # Регистрация вместо наследования46 ```4748 ```pycon49 >>> issubclass(D, Sequence)50 True51 >>> isinstance(D(), Sequence)52 True53 ```5455 В этом примере классу `D` не нужно определять `__contains__`, `__iter__` и `__reversed__`, потому что [оператор in](https://python-all.ru/3.15/reference/expressions.html#comparisons), логика [итерации](https://python-all.ru/3.15/glossary.html#term-iterable) и функция [`reversed()`](https://python-all.ru/3.15/library/functions.html#reversed) автоматически используют `__getitem__` и `__len__`.563. Некоторые простые интерфейсы напрямую распознаются по наличию требуемых методов (если только эти методы не были установлены в [`None`](https://python-all.ru/3.15/library/constants.html#None)):5758 ```python59 class E:60 def __iter__(self): ...61 def __next__(self): ...62 ```6364 ```pycon65 >>> issubclass(E, Iterable)66 True67 >>> isinstance(E(), Iterable)68 True69 ```7071 Сложные интерфейсы не поддерживают этот последний приём, потому что интерфейс – это не просто наличие имён методов. Интерфейсы определяют семантику и взаимосвязи между методами, которые невозможно вывести только по наличию конкретных имён методов. Например, знания того, что класс предоставляет `__getitem__`, `__len__` и `__iter__`, недостаточно, чтобы отличить [`Sequence`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Sequence) от [`Mapping`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Mapping).7273Добавлено в версии 3.9: Теперь эти абстрактные классы поддерживают `[]`. См. [Generic Alias Type](https://python-all.ru/3.15/library/stdtypes.html#types-genericalias) и [**PEP 585**](https://python-all.ru/3.15/library/collections.abc.html).7475## Абстрактные базовые классы коллекций7677Модуль collections предоставляет следующие [абстрактные базовые классы](https://python-all.ru/3.15/glossary.html#term-abstract-base-class):7879| ABC | Наследует от | Абстрактные методы | Методы-примеси |80| --- | --- | --- | --- |81| [`Container`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Container) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | | `__contains__` | |82| [`Hashable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Hashable) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | | `__hash__` | |83| [`Iterable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Iterable) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) [\[2\]](https://python-all.ru/3.15/library/collections.abc.html#id19) | | `__iter__` | |84| [`Iterator`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Iterator) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | [`Iterable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Iterable) | `__next__` | `__iter__` |85| [`Reversible`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Reversible) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | [`Iterable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Iterable) | `__reversed__` | |86| [`Generator`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Generator) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | [`Iterator`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Iterator) | `send`, `throw` | `close`, `__iter__`, `__next__` |87| [`Sized`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Sized) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | | `__len__` | |88| [`Callable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Callable) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | | `__call__` | |89| [`Collection`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Collection) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | [`Sized`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Sized), [`Iterable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Iterable), [`Container`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Container) | `__contains__`, `__iter__`, `__len__` | |90| [`Sequence`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Sequence) | [`Reversible`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Reversible), [`Collection`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Collection) | `__getitem__`, `__len__` | `__contains__`, `__iter__`, `__reversed__`, `index` и `count` |91| [`MutableSequence`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.MutableSequence) | [`Sequence`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Sequence) | `__getitem__`, `__setitem__`, `__delitem__`, `__len__`, `insert` | Унаследованные методы [`Sequence`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Sequence) и `append`, `clear`, `reverse`, `extend`, `pop`, `remove` и `__iadd__` |92| [`ByteString`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.ByteString) | [`Sequence`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Sequence) | `__getitem__`, `__len__` | Унаследованные методы [`Sequence`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Sequence) |93| [`Set`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Set) | [`Collection`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Collection) | `__contains__`, `__iter__`, `__len__` | `__le__`, `__lt__`, `__eq__`, `__ne__`, `__gt__`, `__ge__`, `__and__`, `__or__`, `__sub__`, `__rsub__`, `__xor__`, `__rxor__` и `isdisjoint` |94| [`MutableSet`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.MutableSet) | [`Set`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Set) | `__contains__`, `__iter__`, `__len__`, `add`, `discard` | Унаследованные методы [`Set`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Set) и `clear`, `pop`, `remove`, `__ior__`, `__iand__`, `__ixor__` и `__isub__` |95| [`Mapping`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Mapping) | [`Collection`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Collection) | `__getitem__`, `__iter__`, `__len__` | `__contains__`, `keys`, `items`, `values`, `get`, `__eq__` и `__ne__` |96| [`MutableMapping`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.MutableMapping) | [`Mapping`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Mapping) | `__getitem__`, `__setitem__`, `__delitem__`, `__iter__`, `__len__` | Унаследованные методы [`Mapping`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Mapping) и `pop`, `popitem`, `clear`, `update`, и `setdefault` |97| [`MappingView`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.MappingView) | [`Sized`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Sized) | | `__init__`, `__len__` и `__repr__` |98| [`ItemsView`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.ItemsView) | [`MappingView`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.MappingView), [`Set`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Set) | | `__contains__`, `__iter__` |99| [`KeysView`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.KeysView) | [`MappingView`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.MappingView), [`Set`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Set) | | `__contains__`, `__iter__` |100| [`ValuesView`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.ValuesView) | [`MappingView`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.MappingView), [`Collection`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Collection) | | `__contains__`, `__iter__` |101| [`Awaitable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Awaitable) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | | `__await__` | |102| [`Coroutine`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Coroutine) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | [`Awaitable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Awaitable) | `send`, `throw` | `close` |103| [`AsyncIterable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.AsyncIterable) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | | `__aiter__` | |104| [`AsyncIterator`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.AsyncIterator) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | [`AsyncIterable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.AsyncIterable) | `__anext__` | `__aiter__` |105| [`AsyncGenerator`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.AsyncGenerator) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | [`AsyncIterator`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.AsyncIterator) | `asend`, `athrow` | `aclose`, `__aiter__`, `__anext__` |106| [`Buffer`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Buffer) [\[1\]](https://python-all.ru/3.15/library/collections.abc.html#id18) | | `__buffer__` | |107108Сноски109110\[1\]111112([1](https://python-all.ru/3.15/library/collections.abc.html#id2),[2](https://python-all.ru/3.15/library/collections.abc.html#id3),[3](https://python-all.ru/3.15/library/collections.abc.html#id4),[4](https://python-all.ru/3.15/library/collections.abc.html#id6),[5](https://python-all.ru/3.15/library/collections.abc.html#id7),[6](https://python-all.ru/3.15/library/collections.abc.html#id8),[7](https://python-all.ru/3.15/library/collections.abc.html#id9),[8](https://python-all.ru/3.15/library/collections.abc.html#id10),[9](https://python-all.ru/3.15/library/collections.abc.html#id11),[10](https://python-all.ru/3.15/library/collections.abc.html#id12),[11](https://python-all.ru/3.15/library/collections.abc.html#id13),[12](https://python-all.ru/3.15/library/collections.abc.html#id14),[13](https://python-all.ru/3.15/library/collections.abc.html#id15),[14](https://python-all.ru/3.15/library/collections.abc.html#id16),[15](https://python-all.ru/3.15/library/collections.abc.html#id17))113114Эти ABC переопределяют [`__subclasshook__()`](https://python-all.ru/3.15/library/abc.html#abc.ABCMeta.__subclasshook__) для поддержки проверки интерфейса путём проверки, что требуемые методы присутствуют и не были установлены в [`None`](https://python-all.ru/3.15/library/constants.html#None). Это работает только для простых интерфейсов. Более сложные интерфейсы требуют регистрации или прямого наследования.115116\[[2](https://python-all.ru/3.15/library/collections.abc.html#id5)\]117118Проверка `isinstance(obj, Iterable)` обнаруживает классы, которые зарегистрированы как [`Iterable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Iterable) или имеют метод [`__iter__()`](https://python-all.ru/3.15/library/stdtypes.html#container.__iter__), но не обнаруживает классы, которые выполняют итерацию с помощью метода [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__). Единственный надёжный способ определить, является ли объект [итерируемым](https://python-all.ru/3.15/glossary.html#term-iterable) – вызвать `iter(obj)`.119120## Абстрактные базовые классы коллекций – Подробные описания121122#### `class collections.abc.Container`123124ABC для классов, которые предоставляют метод [`__contains__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__contains__).125126#### `class collections.abc.Hashable`127128ABC для классов, которые предоставляют метод [`__hash__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__hash__).129130#### `class collections.abc.Sized`131132ABC для классов, которые предоставляют метод [`__len__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__len__).133134#### `class collections.abc.Callable`135136ABC для классов, которые предоставляют метод [`__call__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__call__).137138См. [Аннотирование вызываемых объектов](https://python-all.ru/3.15/library/typing.html#annotating-callables) для получения подробной информации о том, как использовать `Callable` в аннотациях типов.139140#### `class collections.abc.Iterable`141142ABC для классов, которые предоставляют метод [`__iter__()`](https://python-all.ru/3.15/library/stdtypes.html#container.__iter__).143144Проверка `isinstance(obj, Iterable)` обнаруживает классы, которые зарегистрированы как `Iterable` или имеют метод [`__iter__()`](https://python-all.ru/3.15/library/stdtypes.html#container.__iter__), но не обнаруживает классы, которые выполняют итерацию с помощью метода [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__). Единственный надёжный способ определить, является ли объект [итерируемым](https://python-all.ru/3.15/glossary.html#term-iterable), – это вызвать `iter(obj)`.145146#### `class collections.abc.Collection`147148ABC для классов-контейнеров, которые поддерживают итерирование и определение размера.149150Добавлено в версии 3.6.151152#### `class collections.abc.Iterator`153154ABC для классов, которые предоставляют методы [`__iter__()`](https://python-all.ru/3.15/library/stdtypes.html#iterator.__iter__) и [`__next__()`](https://python-all.ru/3.15/library/stdtypes.html#iterator.__next__). См. также определение [итератора](https://python-all.ru/3.15/glossary.html#term-iterator).155156#### `class collections.abc.Reversible`157158ABC для итерируемых классов, которые также предоставляют метод [`__reversed__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__reversed__).159160Добавлено в версии 3.6.161162#### `class collections.abc.Generator`163164ABC для классов [генераторов](https://python-all.ru/3.15/glossary.html#term-generator), реализующих протокол, определённый в [**PEP 342**](https://python-all.ru/3.15/library/collections.abc.html), который расширяет [итераторы](https://python-all.ru/3.15/glossary.html#term-iterator) методами [`send()`](https://python-all.ru/3.15/reference/expressions.html#generator.send), [`throw()`](https://python-all.ru/3.15/reference/expressions.html#generator.throw) и [`close()`](https://python-all.ru/3.15/reference/expressions.html#generator.close).165166См. [Аннотирование генераторов и корутин](https://python-all.ru/3.15/library/typing.html#annotating-generators-and-coroutines) для подробностей об использовании `Generator` в аннотациях типов.167168Добавлено в версии 3.5.169170#### `class collections.abc.Sequence`171172#### `class collections.abc.MutableSequence`173174#### `class collections.abc.ByteString`175176ABC для неизменяемых и изменяемых [последовательностей](https://python-all.ru/3.15/glossary.html#term-sequence).177178Примечание по реализации: Некоторые методы-примеси, такие как [`__iter__()`](https://python-all.ru/3.15/library/stdtypes.html#container.__iter__), [`__reversed__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__reversed__), и [`index()`](https://python-all.ru/3.15/library/stdtypes.html#sequence.index), многократно вызывают нижележащий метод [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__). Следовательно, если `__getitem__()` реализован с константной скоростью доступа, производительность методов-примесей будет линейной; однако если нижележащий метод является линейным (как в случае со связным списком), производительность примесей будет квадратичной, и, скорее всего, их потребуется переопределить.179180#### `index(value, start=0, stop=None)`181182Возвращает индекс первого вхождения *value*.183184Возбуждает [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError), если значение отсутствует.185186Поддержка аргументов *start* и *stop* является необязательной, но рекомендуется.187188Изменено в версии 3.5: Метод [`index()`](https://python-all.ru/3.15/library/stdtypes.html#sequence.index) получил поддержку аргументов *stop* и *start*.189190Устарело с версии 3.12, будет удалено в версии 3.17: ABC `ByteString` устарел.191192Используйте `isinstance(obj, collections.abc.Buffer)` для проверки, реализует ли `obj` [буферный протокол](https://python-all.ru/3.15/c-api/buffer.html#bufferobjects) во время выполнения. Для использования в аннотациях типов либо используйте [`Buffer`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Buffer), либо объединение, которое явно указывает типы, поддерживаемые вашим кодом (например, `bytes | bytearray | memoryview`).193194`ByteString` изначально задумывался как абстрактный класс, который должен был служить супертипом как для [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes), так и для [`bytearray`](https://python-all.ru/3.15/library/stdtypes.html#bytearray). Однако, поскольку ABC никогда не имел методов, знание того, что объект является экземпляром `ByteString`, на самом деле никогда не давало полезной информации об объекте. Другие распространённые буферные типы, такие как [`memoryview`](https://python-all.ru/3.15/library/stdtypes.html#memoryview), также никогда не рассматривались как подтипы `ByteString` (ни во время выполнения, ни статическими проверяльщиками типов).195196См. [**PEP 688**](https://python-all.ru/3.15/library/collections.abc.html) для получения дополнительных сведений.197198#### `class collections.abc.Set`199200#### `class collections.abc.MutableSet`201202ABC для неизменяемых и изменяемых [множеств](https://python-all.ru/3.15/library/stdtypes.html#types-set).203204#### `class collections.abc.Mapping`205206#### `class collections.abc.MutableMapping`207208ABC для неизменяемых и изменяемых [отображений](https://python-all.ru/3.15/glossary.html#term-mapping).209210#### `class collections.abc.MappingView`211212#### `class collections.abc.ItemsView`213214#### `class collections.abc.KeysView`215216#### `class collections.abc.ValuesView`217218ABC для [представлений](https://python-all.ru/3.15/glossary.html#term-dictionary-view) отображений, элементов, ключей и значений.219220#### `class collections.abc.Awaitable`221222ABC для [ожидаемых](https://python-all.ru/3.15/glossary.html#term-awaitable) объектов, которые можно использовать в выражениях [`await`](https://python-all.ru/3.15/reference/expressions.html#await). Пользовательские реализации должны предоставлять метод [`__await__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__await__).223224Объекты [Coroutine](https://python-all.ru/3.15/glossary.html#term-coroutine) и экземпляры ABC [`Coroutine`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Coroutine) являются экземплярами этого ABC.225226> **Примечание**227>228> В CPython корутины на основе генераторов ([генераторы](https://python-all.ru/3.15/glossary.html#term-generator), декорированные с помощью [`@types.coroutine`](https://python-all.ru/3.15/library/types.html#types.coroutine)) являются *ожидаемыми объектами*, даже если они не имеют метода [`__await__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__await__). Использование `isinstance(gencoro, Awaitable)` для них вернёт `False`. Для их обнаружения используется [`inspect.isawaitable()`](https://python-all.ru/3.15/library/inspect.html#inspect.isawaitable).229230Добавлено в версии 3.5.231232#### `class collections.abc.Coroutine`233234ABC для [классов, совместимых с корутинами](https://python-all.ru/3.15/glossary.html#term-coroutine). Они реализуют следующие методы, определённые в [Объекты корутины](https://python-all.ru/3.15/reference/datamodel.html#coroutine-objects): [`send()`](https://python-all.ru/3.15/reference/datamodel.html#coroutine.send), [`throw()`](https://python-all.ru/3.15/reference/datamodel.html#coroutine.throw) и [`close()`](https://python-all.ru/3.15/reference/datamodel.html#coroutine.close). Пользовательские реализации также должны реализовать [`__await__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__await__). Все экземпляры `Coroutine` также являются экземплярами [`Awaitable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Awaitable).235236> **Примечание**237>238> В CPython корутины на основе генераторов ([генераторы](https://python-all.ru/3.15/glossary.html#term-generator), декорированные с помощью [`@types.coroutine`](https://python-all.ru/3.15/library/types.html#types.coroutine)) являются *ожидаемыми объектами*, даже если они не имеют метода [`__await__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__await__). Использование `isinstance(gencoro, Coroutine)` для них вернёт `False`. Для их обнаружения используется [`inspect.isawaitable()`](https://python-all.ru/3.15/library/inspect.html#inspect.isawaitable).239240См. [Аннотирование генераторов и корутин](https://python-all.ru/3.15/library/typing.html#annotating-generators-and-coroutines) для подробностей об использовании `Coroutine` в аннотациях типов. Вариантность и порядок параметров типа соответствуют таковым у [`Generator`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Generator).241242Добавлено в версии 3.5.243244#### `class collections.abc.AsyncIterable`245246ABC для классов, предоставляющих метод `__aiter__`. См. также определение [асинхронного итерируемого объекта](https://python-all.ru/3.15/glossary.html#term-asynchronous-iterable).247248Добавлено в версии 3.5.249250#### `class collections.abc.AsyncIterator`251252ABC для классов, предоставляющих методы `__aiter__` и `__anext__`. См. также определение [асинхронного итератора](https://python-all.ru/3.15/glossary.html#term-asynchronous-iterator).253254Добавлено в версии 3.5.255256#### `class collections.abc.AsyncGenerator`257258ABC для [асинхронных генераторов](https://python-all.ru/3.15/glossary.html#term-asynchronous-generator), которые реализуют протокол, определённый в [**PEP 525**](https://python-all.ru/3.15/library/collections.abc.html) и [**PEP 492**](https://python-all.ru/3.15/library/collections.abc.html).259260См. [Аннотирование генераторов и корутин](https://python-all.ru/3.15/library/typing.html#annotating-generators-and-coroutines) для подробностей об использовании `AsyncGenerator` в аннотациях типов.261262Добавлено в версии 3.6.263264#### `class collections.abc.Buffer`265266ABC для классов, предоставляющих метод [`__buffer__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__buffer__), реализующих [протокол буфера](https://python-all.ru/3.15/c-api/buffer.html#bufferobjects). См. [**PEP 688**](https://python-all.ru/3.15/library/collections.abc.html).267268Добавлено в версии 3.12.269270## Примеры и рецепты271272ABC позволяют проверить, предоставляют ли классы или их экземпляры определённую функциональность, например:273274```python275size = None276if isinstance(myvar, collections.abc.Sized):277 size = len(myvar)278```279280Некоторые ABC также полезны в качестве примесей (mixins), упрощающих разработку классов, поддерживающих API контейнеров. Например, чтобы написать класс, поддерживающий полный API [`Set`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Set), достаточно предоставить три основных абстрактных метода: [`__contains__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__contains__), [`__iter__()`](https://python-all.ru/3.15/library/stdtypes.html#container.__iter__) и [`__len__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__len__). ABC предоставляет остальные методы, такие как `__and__()` и [`isdisjoint()`](https://python-all.ru/3.15/library/stdtypes.html#frozenset.isdisjoint):281282```python283class ListBasedSet(collections.abc.Set):284 ''' Альтернативная реализация множества, ориентированная на экономию памяти, а не на скорость285 и не требующая, чтобы элементы множества были хэшируемыми. '''286 def __init__(self, iterable):287 self.elements = lst = []288 for value in iterable:289 if value not in lst:290 lst.append(value)291292 def __iter__(self):293 return iter(self.elements)294295 def __contains__(self, value):296 return value in self.elements297298 def __len__(self):299 return len(self.elements)300301s1 = ListBasedSet('abcdef')302s2 = ListBasedSet('defghi')303overlap = s1 & s2 # Метод __and__() поддерживается автоматически304```305306Замечания по использованию [`Set`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Set) и [`MutableSet`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.MutableSet) в качестве примеси:3073081. Поскольку некоторые операции над множествами создают новые множества, методы по умолчанию в миксинах должны уметь создавать новые экземпляры из [итерируемого объекта](https://python-all.ru/3.15/glossary.html#term-iterable). Предполагается, что конструктор класса имеет сигнатуру вида `ClassName(iterable)`. Это предположение вынесено во внутренний [`classmethod`](https://python-all.ru/3.15/library/functions.html#classmethod), называемый `_from_iterable()`, который вызывает `cls(iterable)` для создания нового множества. Если миксин [`Set`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Set) используется в классе с другой сигнатурой конструктора, потребуется переопределить `_from_iterable()` с помощью метода класса или обычного метода, который может создавать новые экземпляры из итерируемого аргумента.3092. Чтобы переопределить сравнения (предположительно для скорости, так как семантика фиксирована), переопределите [`__le__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__le__) и [`__ge__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__ge__); тогда остальные операции автоматически последуют их примеру.3103. Миксин [`Set`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Set) предоставляет метод `_hash()` для вычисления хеш-значения множества; однако [`__hash__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__hash__) не определён, поскольку не все множества являются [хешируемыми](https://python-all.ru/3.15/glossary.html#term-hashable) или неизменяемыми. Чтобы добавить хешируемость множеству с помощью миксинов, наследуйтесь от обоих `Set` и [`Hashable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Hashable), а затем определите `__hash__ = Set._hash`.311312> **См. также**313>314> - [Рецепт OrderedSet](https://python-all.ru/3.15/library/collections.abc.html) для примера, построенного на [`MutableSet`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.MutableSet).315> - Для получения дополнительной информации об ABC см. модуль [`abc`](https://python-all.ru/3.15/library/abc.html#module-abc) и .316