collections.abc — Абстрактные базовые классы для контейнеров
Новое в версии 3.3: Ранее этот модуль был частью модуля collections.
Исходный код: Lib/_collections_abc.py
Этот модуль предоставляет абстрактные базовые классы, которые можно использовать для проверки, предоставляет ли класс определённый интерфейс; например, является ли он хешируемым или является ли он отображением.
8.4.1. Абстрактные базовые классы модуля collections
Модуль collections предлагает следующие ABC:
ABC | Наследуется от | Абстрактные методы | Методы миксина |
|---|---|---|---|
| |||
| |||
| |||
|
| ||
| |||
|
| ||
| |||
| |||
| |||
|
| ||
| Наследованные методы | ||
| Наследованные методы | ||
|
| ||
| Наследованные методы | ||
|
| ||
| Наследованные методы | ||
| |||
| |||
| |||
| |||
| |||
|
| ||
| |||
|
| ||
|
|
-
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__().Проверка
isinstance(obj, Iterable)определяет классы, зарегистрированные какIterableили имеющие метод__iter__(), но не определяет классы, которые итерируются с помощью метода__getitem__(). Единственный надежный способ определить, является ли объект итерируемым, — вызватьiter(obj).
-
class collections.abc.Collection -
ABC для классов контейнеров итерируемых объектов с размером.
Добавлена в версии 3.6.
-
class collections.abc.Iterator -
ABC для классов, которые предоставляют методы
__iter__()и__next__(). См. также определение итератора.
-
class collections.abc.Reversible -
ABC для итерируемых классов, которые также предоставляют метод
__reversed__().Добавлена в версии 3.6.
-
class collections.abc.Generator -
ABC для классов генераторов, которые реализуют протокол, определённый в PEP 342, который расширяет итераторы с методами
send(),throw()иclose(). См. также определение генератора.Добавлена в версии 3.5.
-
class collections.abc.Sequence -
class collections.abc.MutableSequence -
class collections.abc.ByteString -
ABC для неизменяемых и изменяемых последовательностей.
Примечание по реализации: Некоторые из методов-миксов, такие как
__iter__(),__reversed__()иindex(), многократно вызывают базовый метод__getitem__(). Следовательно, если__getitem__()реализован с постоянной скоростью доступа, то методы-миксы будут иметь линейную производительность; однако, если базовый метод имеет линейную производительность (как это было бы с связанным списком), то миксины будут иметь квадратичную производительность и, скорее всего, потребуют переопределения.Изменено в версии 3.5: Метод index() получил поддержку аргументов stop и start.
-
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 для отображений, элементов, ключей и значений представлений.
-
class collections.abc.Awaitable -
ABC для объектов-ожиданий, которые могут быть использованы в выражениях
await. Пользовательские реализации должны предоставить метод__await__().Объекты корутин и экземпляры ABC
Coroutine— это все экземпляры этого ABC.Примечание
В CPython, генераторные корутины (генераторы, декорированные
types.coroutine()илиasyncio.coroutine()) являются объектами-ожиданиями, даже если у них нет метода__await__(). Использованиеisinstance(gencoro, Awaitable)для них вернётFalse. Используйтеinspect.isawaitable(), чтобы определить их.Добавлена в версии 3.5.
-
class collections.abc.Coroutine -
ABC для совместимых с корутинами классов. Они реализуют следующие методы, определённые в Объекты корутины:
send(),throw()иclose(). Пользовательские реализации также должны реализовывать__await__(). Все экземплярыCoroutineтакже являются экземплярамиAwaitable. См. также определение корутины.Примечание
В CPython генераторные корутины (генераторы, декорированные
types.coroutine()илиasyncio.coroutine()) являются объектами-ожиданиями, даже если у них нет метода__await__(). Использованиеisinstance(gencoro, Coroutine)для них вернётFalse. Используйтеinspect.isawaitable(), чтобы определить их.Добавлена в версии 3.5.
-
class collections.abc.AsyncIterable -
ABC для классов, предоставляющих метод
__aiter__. См. также определение асинхронного итерируемого объекта.Новое в версии 3.5.
-
class collections.abc.AsyncIterator -
ABC для классов, предоставляющих методы
__aiter__и__anext__. См. также определение асинхронного итератора.Новое в версии 3.5.
-
class collections.abc.AsyncGenerator -
ABC для асинхронных классов генераторов, которые реализуют протокол, определённый в PEP 525 и PEP 492.
Новое в версии 3.6.
Эти 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):
''' Alternate set implementation favoring space over speed
and not requiring the set elements to be hashable. '''
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 # The __and__() method is supported automatically
Примечания по использованию 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.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/collections.abc.html