collections.abc — Абстрактные базовые классы для контейнеров
Новое в версии 3.3: Раньше этот модуль был частью модуля collections.
Исходный код: Lib/_collections_abc.py
Этот модуль предоставляет абстрактные базовые классы, которые могут использоваться для проверки, предоставляет ли класс определенный интерфейс; например, является ли он хешируемым или является ли он отображением.
Абстрактные базовые классы модуля Collections
Модуль collections предлагает следующие АБК:
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.7/library/collections.abc.html