Документация Python неофициальный перевод

collections.abc.md

127 строк · 14.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.3/library/collections.abc.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.4. [`collections.abc`](https://python-all.ru/3.3/library/collections.abc.html#module-collections.abc) – Абстрактные базовые классы для контейнеров89Новое в версии 3.3: Ранее этот модуль был частью модуля [`collections`](https://python-all.ru/3.3/library/collections.html#module-collections).1011**Исходный код:** [Lib/collections/abc.py](https://python-all.ru/src/3.3/Lib/collections/abc.py)1213---1415Этот модуль предоставляет [*абстрактные базовые классы*](https://python-all.ru/3.3/glossary.html#term-abstract-base-class), которые можно использовать для проверки, реализует ли класс определённый интерфейс; например, является ли он хешируемым или отображением.1617## 8.4.1. Абстрактные базовые классы коллекций1819Модуль collections предоставляет следующие [*абстрактные базовые классы*](https://python-all.ru/3.3/glossary.html#term-abstract-base-class):2021| ABC | Наследует от | Абстрактные методы | Методы-примеси |22| --- | --- | --- | --- |23| [`Container`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Container) |  | `__contains__` |  |24| [`Hashable`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Hashable) |  | `__hash__` |  |25| [`Iterable`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Iterable) |  | `__iter__` |  |26| [`Iterator`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Iterator) | [`Iterable`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Iterable) | `__next__` | `__iter__` |27| [`Sized`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Sized) |  | `__len__` |  |28| [`Callable`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Callable) |  | `__call__` |  |29| [`Sequence`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Sequence) | [`Sized`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Sized), [`Iterable`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Iterable), [`Container`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Container) | `__getitem__`, `__len__` | `__contains__`, `__iter__`, `__reversed__`, `index` и `count` |30| [`MutableSequence`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.MutableSequence) | [`Sequence`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Sequence) | `__getitem__`, `__setitem__`, `__delitem__`, `__len__`, `insert` | Унаследованные методы [`Sequence`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Sequence) и `append`, `reverse`, `extend`, `pop`, `remove` и `__iadd__` |31| [`Set`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Set) | [`Sized`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Sized), [`Iterable`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Iterable), [`Container`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Container) | `__contains__`, `__iter__`, `__len__` | `__le__`, `__lt__`, `__eq__`, `__ne__`, `__gt__`, `__ge__`, `__and__`, `__or__`, `__sub__`, `__xor__` и `isdisjoint` |32| [`MutableSet`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.MutableSet) | [`Set`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Set) | `__contains__`, `__iter__`, `__len__`, `add`, `discard` | Унаследованные [`Set`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Set) методы и `clear`, `pop`, `remove`, `__ior__`, `__iand__`, `__ixor__` и `__isub__` |33| [`Mapping`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Mapping) | [`Sized`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Sized), [`Iterable`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Iterable), [`Container`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Container) | `__getitem__`, `__iter__`, `__len__` | `__contains__`, `keys`, `items`, `values`, `get`, `__eq__` и `__ne__` |34| [`MutableMapping`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.MutableMapping) | [`Mapping`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Mapping) | `__getitem__`, `__setitem__`, `__delitem__`, `__iter__`, `__len__` | Унаследованные [`Mapping`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Mapping) методы и `pop`, `popitem`, `clear`, `update`, и `setdefault` |35| [`MappingView`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.MappingView) | [`Sized`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Sized) |  | `__len__` |36| [`ItemsView`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.ItemsView) | [`MappingView`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.MappingView), [`Set`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Set) |  | `__contains__`, `__iter__` |37| [`KeysView`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.KeysView) | [`MappingView`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.MappingView), [`Set`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Set) |  | `__contains__`, `__iter__` |38| [`ValuesView`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.ValuesView) | [`MappingView`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.MappingView) |  | `__contains__`, `__iter__` |3940#### `class collections.abc.Container`4142#### `class collections.abc.Hashable`4344#### `class collections.abc.Sized`4546#### `class collections.abc.Callable`4748Абстрактные базовые классы (ABC) для классов, предоставляющих соответственно методы [`__contains__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__contains__), [`__hash__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__hash__), [`__len__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__len__) и [`__call__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__call__).4950#### `class collections.abc.Iterable`5152ABC для классов, предоставляющих метод [`__iter__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__iter__). См. также определение [*итерируемого объекта*](https://python-all.ru/3.3/glossary.html#term-iterable).5354#### `class collections.abc.Iterator`5556ABC для классов, предоставляющих методы [`__iter__()`](https://python-all.ru/3.3/library/stdtypes.html#iterator.__iter__) и [`__next__()`](https://python-all.ru/3.3/library/stdtypes.html#iterator.__next__). См. также определение [*итератора*](https://python-all.ru/3.3/glossary.html#term-iterator).5758#### `class collections.abc.Sequence`5960#### `class collections.abc.MutableSequence`6162ABC для неизменяемых и изменяемых [*последовательностей*](https://python-all.ru/3.3/glossary.html#term-sequence).6364#### `class collections.abc.Set`6566#### `class collections.abc.MutableSet`6768ABC для наборов только для чтения и изменяемых наборов.6970#### `class collections.abc.Mapping`7172#### `class collections.abc.MutableMapping`7374ABC для неизменяемых и изменяемых [*отображений*](https://python-all.ru/3.3/glossary.html#term-mapping).7576#### `class collections.abc.MappingView`7778#### `class collections.abc.ItemsView`7980#### `class collections.abc.KeysView`8182#### `class collections.abc.ValuesView`8384ABC для [*представлений*](https://python-all.ru/3.3/glossary.html#term-view) отображений, элементов, ключей и значений.8586Эти ABC позволяют проверять, предоставляют ли классы или их экземпляры определённую функциональность, например:8788```python89size = None90if isinstance(myvar, collections.abc.Sized):91    size = len(myvar)92```9394Некоторые из ABC также полезны в качестве примесей, упрощающих разработку классов, поддерживающих API контейнеров. Например, чтобы написать класс, поддерживающий полный API [`Set`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Set), достаточно предоставить три базовых абстрактных метода: [`__contains__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__contains__), [`__iter__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__iter__) и [`__len__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__len__). ABC предоставляет остальные методы, такие как [`__and__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__and__) и `isdisjoint()`:9596```python97class ListBasedSet(collections.abc.Set):98     ''' Альтернативная реализация множества, ориентированная на экономию памяти, а не на скорость99         и не требующая, чтобы элементы множества были хэшируемыми. '''100     def __init__(self, iterable):101         self.elements = lst = []102         for value in iterable:103             if value not in lst:104                 lst.append(value)105     def __iter__(self):106         return iter(self.elements)107     def __contains__(self, value):108         return value in self.elements109     def __len__(self):110         return len(self.elements)111112s1 = ListBasedSet('abcdef')113s2 = ListBasedSet('defghi')114overlap = s1 & s2            # Метод __and__() поддерживается автоматически115```116117Замечания по использованию [`Set`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Set) и [`MutableSet`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.MutableSet) в качестве миксина:1181191. Поскольку некоторые операции над множествами создают новые множества, методам миксина по умолчанию требуется способ создавать новые экземпляры из итерируемого объекта. Предполагается, что конструктор класса имеет сигнатуру вида `ClassName(iterable)`. Это предположение вынесено во внутренний метод класса `_from_iterable()`, который вызывает `cls(iterable)` для создания нового множества. Если миксин [`Set`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Set) используется в классе с другой сигнатурой конструктора, потребуется переопределить `_from_iterable()` методом класса, который сможет создавать новые экземпляры из итерируемого аргумента.1202. Чтобы переопределить операции сравнения (предположительно для скорости, так как семантика фиксирована), переопределите [`__le__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__le__), и остальные операции автоматически последуют этому примеру.1213. Примесь [`Set`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Set) предоставляет метод `_hash()` для вычисления хеш-значения множества; однако [`__hash__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__hash__) не определён, поскольку не все множества являются хешируемыми или неизменяемыми. Чтобы добавить хешируемость множеству с помощью примесей, унаследуйтесь от [`Set()`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Set) и [`Hashable()`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.Hashable), затем определите `__hash__ = Set._hash`.122123> **См. также**124>125> - [Рецепт OrderedSet](https://python-all.ru/3.3/library/collections.abc.html) для примера, построенного на основе [`MutableSet`](https://python-all.ru/3.3/library/collections.abc.html#collections.abc.MutableSet).126> - Для получения дополнительной информации об ABC см. модуль [`abc`](https://python-all.ru/3.3/library/abc.html#module-abc) и [**PEP 3119**](https://python-all.ru/3.3/library/collections.abc.html).127