collections.abc.md
1> **Источник:** https://python-all.ru/3.10/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.10/library/collections.abc.html#module-collections.abc) – Абстрактные базовые классы для контейнеров89Новинка версии 3.3: Ранее этот модуль был частью модуля [`collections`](https://python-all.ru/3.10/library/collections.html#module-collections).1011**Исходный код:** [Lib/\_collections\_abc.py](https://python-all.ru/src/3.10/Lib/_collections_abc.py)1213---1415Этот модуль предоставляет [абстрактные базовые классы](https://python-all.ru/3.10/glossary.html#term-abstract-base-class), которые можно использовать для проверки, предоставляет ли класс определённый интерфейс; например, является ли он [хэшируемым](https://python-all.ru/3.10/glossary.html#term-hashable) или отображением.1617Проверка [`issubclass()`](https://python-all.ru/3.10/library/functions.html#issubclass) или [`isinstance()`](https://python-all.ru/3.10/library/functions.html#isinstance) для интерфейса работает одним из трёх способов.18191) Недавно написанный класс может наследовать напрямую от одного из абстрактных базовых классов. Класс должен предоставлять требуемые абстрактные методы. Остальные методы-примеси достаются по наследству и могут быть переопределены при необходимости. Другие методы можно добавлять по мере необходимости:2021```python22class 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)31True32>>> isinstance(C(), Sequence)33True34```35362) Существующие и встроенные классы могут быть зарегистрированы как «виртуальные подклассы» ABC. Такие классы должны определять полный API, включая все абстрактные методы и все методы-примеси. Это позволяет пользователям полагаться на проверки [`issubclass()`](https://python-all.ru/3.10/library/functions.html#issubclass) или [`isinstance()`](https://python-all.ru/3.10/library/functions.html#isinstance), чтобы определить, поддерживается ли полный интерфейс. Исключение из этого правила составляют методы, которые автоматически выводятся из остального API:3738```python39class D: # Нет наследования40 def __init__(self): ... # Дополнительный метод, не требуемый ABC41 def __getitem__(self, index): ... # Обязательный абстрактный метод42 def __len__(self): ... # Обязательный абстрактный метод43 def count(self, value): ... # Метод-примесь44 def index(self, value): ... # Метод-примесь4546Sequence.register(D) # Регистрация вместо наследования47```4849```pycon50>>> issubclass(D, Sequence)51True52>>> isinstance(D(), Sequence)53True54```5556В этом примере классу `D` не нужно определять `__contains__`, `__iter__` и `__reversed__`, потому что [оператор in](https://python-all.ru/3.10/reference/expressions.html#comparisons), логика [итерации](https://python-all.ru/3.10/glossary.html#term-iterable) и функция [`reversed()`](https://python-all.ru/3.10/library/functions.html#reversed) автоматически используют `__getitem__` и `__len__`.57583) Некоторые простые интерфейсы распознаются напрямую по наличию требуемых методов (если только эти методы не были установлены в [`None`](https://python-all.ru/3.10/library/constants.html#None)):5960```python61class E:62 def __iter__(self): ...63 def __next__(next): ...64```6566```pycon67>>> issubclass(E, Iterable)68True69>>> isinstance(E(), Iterable)70True71```7273Сложные интерфейсы не поддерживают этот последний приём, потому что интерфейс – это не просто наличие имён методов. Интерфейсы определяют семантику и взаимосвязи между методами, которые невозможно вывести только по наличию конкретных имён методов. Например, знания того, что класс предоставляет `__getitem__`, `__len__` и `__iter__`, недостаточно, чтобы отличить [`Sequence`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Sequence) от [`Mapping`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Mapping).7475Новинка версии 3.9: Эти абстрактные классы теперь поддерживают `[]`. См. [Generic Alias Type](https://python-all.ru/3.10/library/stdtypes.html#types-genericalias) и [**PEP 585**](https://python-all.ru/3.10/library/collections.abc.html).7677## Абстрактные базовые классы коллекций7879Модуль collections предоставляет следующие [абстрактные базовые классы](https://python-all.ru/3.10/glossary.html#term-abstract-base-class):8081| ABC | Наследует от | Абстрактные методы | Методы-примеси |82| --- | --- | --- | --- |83| [`Container`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Container) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | | `__contains__` | |84| [`Hashable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Hashable) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | | `__hash__` | |85| [`Iterable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Iterable) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) [2](https://python-all.ru/3.10/library/collections.abc.html#id18) | | `__iter__` | |86| [`Iterator`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Iterator) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | [`Iterable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Iterable) | `__next__` | `__iter__` |87| [`Reversible`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Reversible) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | [`Iterable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Iterable) | `__reversed__` | |88| [`Generator`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Generator) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | [`Iterator`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Iterator) | `send`, `throw` | `close`, `__iter__`, `__next__` |89| [`Sized`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Sized) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | | `__len__` | |90| [`Callable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Callable) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | | `__call__` | |91| [`Collection`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Collection) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | [`Sized`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Sized), [`Iterable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Iterable), [`Container`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Container) | `__contains__`, `__iter__`, `__len__` | |92| [`Sequence`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Sequence) | [`Reversible`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Reversible), [`Collection`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Collection) | `__getitem__`, `__len__` | `__contains__`, `__iter__`, `__reversed__`, `index` и `count` |93| [`MutableSequence`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.MutableSequence) | [`Sequence`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Sequence) | `__getitem__`, `__setitem__`, `__delitem__`, `__len__`, `insert` | Наследуемые методы [`Sequence`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Sequence) и `append`, `reverse`, `extend`, `pop`, `remove` и `__iadd__` |94| [`ByteString`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.ByteString) | [`Sequence`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Sequence) | `__getitem__`, `__len__` | Унаследованные методы [`Sequence`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Sequence) |95| [`Set`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Set) | [`Collection`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Collection) | `__contains__`, `__iter__`, `__len__` | `__le__`, `__lt__`, `__eq__`, `__ne__`, `__gt__`, `__ge__`, `__and__`, `__or__`, `__sub__`, `__xor__` и `isdisjoint` |96| [`MutableSet`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.MutableSet) | [`Set`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Set) | `__contains__`, `__iter__`, `__len__`, `add`, `discard` | Унаследованные методы [`Set`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Set) и `clear`, `pop`, `remove`, `__ior__`, `__iand__`, `__ixor__` и `__isub__` |97| [`Mapping`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Mapping) | [`Collection`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Collection) | `__getitem__`, `__iter__`, `__len__` | `__contains__`, `keys`, `items`, `values`, `get`, `__eq__` и `__ne__` |98| [`MutableMapping`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.MutableMapping) | [`Mapping`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Mapping) | `__getitem__`, `__setitem__`, `__delitem__`, `__iter__`, `__len__` | Унаследованные методы [`Mapping`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Mapping) и `pop`, `popitem`, `clear`, `update`, и `setdefault` |99| [`MappingView`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.MappingView) | [`Sized`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Sized) | | `__len__` |100| [`ItemsView`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.ItemsView) | [`MappingView`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.MappingView), [`Set`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Set) | | `__contains__`, `__iter__` |101| [`KeysView`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.KeysView) | [`MappingView`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.MappingView), [`Set`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Set) | | `__contains__`, `__iter__` |102| [`ValuesView`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.ValuesView) | [`MappingView`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.MappingView), [`Collection`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Collection) | | `__contains__`, `__iter__` |103| [`Awaitable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Awaitable) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | | `__await__` | |104| [`Coroutine`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Coroutine) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | [`Awaitable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Awaitable) | `send`, `throw` | `close` |105| [`AsyncIterable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.AsyncIterable) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | | `__aiter__` | |106| [`AsyncIterator`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.AsyncIterator) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | [`AsyncIterable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.AsyncIterable) | `__anext__` | `__aiter__` |107| [`AsyncGenerator`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.AsyncGenerator) [1](https://python-all.ru/3.10/library/collections.abc.html#id17) | [`AsyncIterator`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.AsyncIterator) | `asend`, `athrow` | `aclose`, `__aiter__`, `__anext__` |108109Сноски110111**1([1](https://python-all.ru/3.10/library/collections.abc.html#id2),[2](https://python-all.ru/3.10/library/collections.abc.html#id3),[3](https://python-all.ru/3.10/library/collections.abc.html#id4),[4](https://python-all.ru/3.10/library/collections.abc.html#id6),[5](https://python-all.ru/3.10/library/collections.abc.html#id7),[6](https://python-all.ru/3.10/library/collections.abc.html#id8),[7](https://python-all.ru/3.10/library/collections.abc.html#id9),[8](https://python-all.ru/3.10/library/collections.abc.html#id10),[9](https://python-all.ru/3.10/library/collections.abc.html#id11),[10](https://python-all.ru/3.10/library/collections.abc.html#id12),[11](https://python-all.ru/3.10/library/collections.abc.html#id13),[12](https://python-all.ru/3.10/library/collections.abc.html#id14),[13](https://python-all.ru/3.10/library/collections.abc.html#id15),[14](https://python-all.ru/3.10/library/collections.abc.html#id16))**112113Эти ABC переопределяют `object.__subclasshook__()` для поддержки проверки интерфейса путём проверки, что требуемые методы присутствуют и не были установлены в [`None`](https://python-all.ru/3.10/library/constants.html#None). Это работает только для простых интерфейсов. Более сложные интерфейсы требуют регистрации или прямого наследования.114115**[2](https://python-all.ru/3.10/library/collections.abc.html#id5)**116117Проверка `isinstance(obj, Iterable)` обнаруживает классы, которые зарегистрированы как [`Iterable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Iterable) или имеют метод `__iter__()`, но не обнаруживает классы, которые выполняют итерацию с помощью метода `__getitem__()`. Единственный надёжный способ определить, является ли объект [итерируемым](https://python-all.ru/3.10/glossary.html#term-iterable) – вызвать `iter(obj)`.118119## Абстрактные базовые классы коллекций – Подробные описания120121#### `class collections.abc.Container`122123ABC для классов, которые предоставляют метод `__contains__()`.124125#### `class collections.abc.Hashable`126127ABC для классов, которые предоставляют метод `__hash__()`.128129#### `class collections.abc.Sized`130131ABC для классов, которые предоставляют метод `__len__()`.132133#### `class collections.abc.Callable`134135ABC для классов, которые предоставляют метод `__call__()`.136137#### `class collections.abc.Iterable`138139ABC для классов, которые предоставляют метод `__iter__()`.140141Проверка `isinstance(obj, Iterable)` обнаруживает классы, которые зарегистрированы как [`Iterable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Iterable) или имеют метод `__iter__()`, но она не обнаруживает классы, которые итерируются с помощью метода `__getitem__()`. Единственный надёжный способ определить, является ли объект [итерируемым](https://python-all.ru/3.10/glossary.html#term-iterable), – вызвать `iter(obj)`.142143#### `class collections.abc.Collection`144145ABC для классов-контейнеров, которые поддерживают итерирование и определение размера.146147Новое в версии 3.6.148149#### `class collections.abc.Iterator`150151ABC для классов, которые предоставляют методы [`__iter__()`](https://python-all.ru/3.10/library/stdtypes.html#iterator.__iter__) и [`__next__()`](https://python-all.ru/3.10/library/stdtypes.html#iterator.__next__). См. также определение [итератора](https://python-all.ru/3.10/glossary.html#term-iterator).152153#### `class collections.abc.Reversible`154155ABC для итерируемых классов, которые также предоставляют метод `__reversed__()`.156157Новое в версии 3.6.158159#### `class collections.abc.Generator`160161ABC для классов-генераторов, реализующих протокол, определённый в [**PEP 342**](https://python-all.ru/3.10/library/collections.abc.html), который расширяет итераторы методами [`send()`](https://python-all.ru/3.10/reference/expressions.html#generator.send), [`throw()`](https://python-all.ru/3.10/reference/expressions.html#generator.throw) и [`close()`](https://python-all.ru/3.10/reference/expressions.html#generator.close). См. также определение [генератора](https://python-all.ru/3.10/glossary.html#term-generator).162163Новое в версии 3.5.164165#### `class collections.abc.Sequence`166167#### `class collections.abc.MutableSequence`168169#### `class collections.abc.ByteString`170171ABC для неизменяемых и изменяемых [последовательностей](https://python-all.ru/3.10/glossary.html#term-sequence).172173Примечание к реализации: некоторые методы-примеси, такие как `__iter__()`, `__reversed__()` и `index()`, многократно вызывают базовый метод `__getitem__()`. Следовательно, если метод `__getitem__()` реализован с постоянной скоростью доступа, методы-примеси будут иметь линейную производительность; однако, если базовый метод является линейным (как в случае со связным списком), производительность примесей станет квадратичной, и их, скорее всего, придётся переопределить.174175Изменено в версии 3.5: Метод index() получил поддержку *stop* и *start* аргументов.176177#### `class collections.abc.Set`178179#### `class collections.abc.MutableSet`180181ABC для наборов только для чтения и изменяемых наборов.182183#### `class collections.abc.Mapping`184185#### `class collections.abc.MutableMapping`186187ABC для неизменяемых и изменяемых [отображений](https://python-all.ru/3.10/glossary.html#term-mapping).188189#### `class collections.abc.MappingView`190191#### `class collections.abc.ItemsView`192193#### `class collections.abc.KeysView`194195#### `class collections.abc.ValuesView`196197ABC для [представлений](https://python-all.ru/3.10/glossary.html#term-dictionary-view) отображений, элементов, ключей и значений.198199#### `class collections.abc.Awaitable`200201ABC для [ожидаемых](https://python-all.ru/3.10/glossary.html#term-awaitable) объектов, которые могут использоваться в выражениях [`await`](https://python-all.ru/3.10/reference/expressions.html#await). Пользовательские реализации должны предоставлять метод `__await__()` .202203Объекты [Coroutine](https://python-all.ru/3.10/glossary.html#term-coroutine) и экземпляры ABC [`Coroutine`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Coroutine) являются экземплярами этого ABC.204205> **Примечание**206>207> В CPython корутины на основе генераторов (генераторы, декорированные [`types.coroutine()`](https://python-all.ru/3.10/library/types.html#types.coroutine) или [`asyncio.coroutine()`](https://python-all.ru/3.10/library/asyncio-task.html#asyncio.coroutine)) являются *ожидаемыми объектами*, даже если у них нет метода `__await__()`. Использование `isinstance(gencoro, Awaitable)` для них вернёт `False`. Используйте [`inspect.isawaitable()`](https://python-all.ru/3.10/library/inspect.html#inspect.isawaitable) для их обнаружения.208209Новое в версии 3.5.210211#### `class collections.abc.Coroutine`212213ABC для классов, совместимых с корутинами. Они реализуют следующие методы, определённые в [Объектах корутин](https://python-all.ru/3.10/reference/datamodel.html#coroutine-objects): [`send()`](https://python-all.ru/3.10/reference/datamodel.html#coroutine.send), [`throw()`](https://python-all.ru/3.10/reference/datamodel.html#coroutine.throw) и [`close()`](https://python-all.ru/3.10/reference/datamodel.html#coroutine.close). Пользовательские реализации также должны реализовывать `__await__()`. Все экземпляры [`Coroutine`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Coroutine) также являются экземплярами [`Awaitable`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Awaitable). См. также определение [корутины](https://python-all.ru/3.10/glossary.html#term-coroutine).214215> **Примечание**216>217> В CPython корутины на основе генераторов (генераторы, декорированные [`types.coroutine()`](https://python-all.ru/3.10/library/types.html#types.coroutine) или [`asyncio.coroutine()`](https://python-all.ru/3.10/library/asyncio-task.html#asyncio.coroutine)) являются *ожидаемыми объектами*, даже если у них нет метода `__await__()`. Использование `isinstance(gencoro, Coroutine)` для них вернёт `False`. Используйте [`inspect.isawaitable()`](https://python-all.ru/3.10/library/inspect.html#inspect.isawaitable) для их обнаружения.218219Новое в версии 3.5.220221#### `class collections.abc.AsyncIterable`222223ABC для классов, предоставляющих метод `__aiter__`. См. также определение [асинхронного итерируемого](https://python-all.ru/3.10/glossary.html#term-asynchronous-iterable).224225Новое в версии 3.5.226227#### `class collections.abc.AsyncIterator`228229ABC для классов, предоставляющих методы `__aiter__` и `__anext__`. См. также определение [асинхронного итератора](https://python-all.ru/3.10/glossary.html#term-asynchronous-iterator).230231Новое в версии 3.5.232233#### `class collections.abc.AsyncGenerator`234235ABC для классов асинхронных генераторов, реализующих протокол, определённый в [**PEP 525**](https://python-all.ru/3.10/library/collections.abc.html) и [**PEP 492**](https://python-all.ru/3.10/library/collections.abc.html).236237Новое в версии 3.6.238239## Примеры и рецепты240241ABC позволяют проверить, предоставляют ли классы или их экземпляры определённую функциональность, например:242243```python244size = None245if isinstance(myvar, collections.abc.Sized):246 size = len(myvar)247```248249Некоторые из ABC также полезны в качестве примесей (mixins), упрощающих разработку классов, поддерживающих API контейнеров. Например, чтобы написать класс, поддерживающий полный API [`Set`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Set), достаточно предоставить три основных абстрактных метода: `__contains__()`, `__iter__()` и `__len__()`. ABC предоставляет остальные методы, такие как `__and__()` и `isdisjoint()`:250251```python252class ListBasedSet(collections.abc.Set):253 ''' Альтернативная реализация множества, ориентированная на экономию памяти, а не на скорость254 и не требующая, чтобы элементы множества были хэшируемыми. '''255 def __init__(self, iterable):256 self.elements = lst = []257 for value in iterable:258 if value not in lst:259 lst.append(value)260261 def __iter__(self):262 return iter(self.elements)263264 def __contains__(self, value):265 return value in self.elements266267 def __len__(self):268 return len(self.elements)269270s1 = ListBasedSet('abcdef')271s2 = ListBasedSet('defghi')272overlap = s1 & s2 # Метод __and__() поддерживается автоматически273```274275Замечания по использованию [`Set`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Set) и [`MutableSet`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.MutableSet) в качестве примеси:2762771. Поскольку некоторые операции над множествами создают новые множества, методам примеси по умолчанию нужен способ создавать новые экземпляры из итерируемого объекта. Предполагается, что конструктор класса имеет сигнатуру вида `ClassName(iterable)`. Это предположение вынесено во внутренний метод класса, называемый `_from_iterable()`, который вызывает `cls(iterable)` для создания нового множества. Если примесь [`Set`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Set) используется в классе с другой сигнатурой конструктора, потребуется переопределить `_from_iterable()` методом класса или обычным методом, который может создавать новые экземпляры из итерируемого аргумента.2782. Чтобы переопределить сравнения (предположительно для скорости, так как семантика фиксирована), переопределите `__le__()` и `__ge__()`, тогда остальные операции будут автоматически им следовать.2793. Миксин [`Set`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Set) предоставляет метод `_hash()` для вычисления хеш-значения множества; однако `__hash__()` не определён, поскольку не все множества являются [хешируемыми](https://python-all.ru/3.10/glossary.html#term-hashable) или неизменяемыми. Чтобы добавить хешируемость множеству с помощью миксинов, наследуйтесь от обоих [`Set()`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Set) и [`Hashable()`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Hashable), а затем определите `__hash__ = Set._hash`.280281> **См. также**282>283> - [Рецепт OrderedSet](https://python-all.ru/3.10/library/collections.abc.html) для примера, построенного на [`MutableSet`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.MutableSet).284> - Для получения дополнительной информации об ABC см. модуль [`abc`](https://python-all.ru/3.10/library/abc.html#module-abc) и .285