collections.abc — Абстрактные базовые классы для контейнеров
Новое в версии 3.3: Ранее этот модуль был частью модуля collections.
Исходный код: Lib/_collections_abc.py
Этот модуль предоставляет абстрактные базовые классы, которые могут быть использованы для проверки, предоставляет ли класс определённый интерфейс; например, является ли он хешируемым или отображением.
1. Коллекции Абстрактные базовые классы
Модуль collections предлагает следующие ABC:
| ABC | Наследует от | Абстрактные методы | Методы-микшины |
|---|---|---|---|
Container | __contains__ | ||
Hashable | __hash__ | ||
Iterable | __iter__ | ||
Iterator | Iterable | __next__ | __iter__ |
Generator | Iterator |
send, throw
|
close, __iter__, __next__
|
Sized | __len__ | ||
Callable | __call__ | ||
Sequence |
Sized, Iterable, Container
|
__getitem__, __len__
|
__contains__, __iter__, __reversed__, index, и count
|
MutableSequence | Sequence |
__getitem__, __setitem__, __delitem__, __len__, insert
| Наследованные методы Sequence и append, reverse, extend, pop, remove, и __iadd__
|
ByteString | Sequence |
__getitem__, __len__
| Наследованные методы Sequence |
Set |
Sized, Iterable, Container
|
__contains__, __iter__, __len__
|
__le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__, __sub__, __xor__, и isdisjoint
|
MutableSet | Set |
__contains__, __iter__, __len__, add, discard
| Наследованные методы Set и clear, pop, remove, __ior__, __iand__, __ixor__, и __isub__
|
Mapping |
Sized, Iterable, Container
|
__getitem__, __iter__, __len__
|
__contains__, keys, items, values, get, __eq__, и __ne__
|
MutableMapping | Mapping |
__getitem__, __setitem__, __delitem__, __iter__, __len__
| Наследованные методы Mapping и pop, popitem, clear, update, и setdefault
|
MappingView | Sized | __len__ | |
ItemsView |
MappingView, Set
|
__contains__, __iter__
| |
KeysView |
MappingView, Set
|
__contains__, __iter__
| |
ValuesView | MappingView |
__contains__, __iter__
| |
Awaitable | __await__ | ||
Coroutine | Awaitable |
send, throw
| close |
AsyncIterable | __aiter__ | ||
AsyncIterator | AsyncIterable | __anext__ | __aiter__ |
-
class collections.abc.Container -
class collections.abc.Hashable -
class collections.abc.Sized -
class collections.abc.Callable -
ABCs for classes that provide respectively the methods
__contains__(),__hash__(),__len__(), and__call__().
-
class collections.abc.Iterable -
ABC для классов, которые предоставляют метод
__iter__(). См. также определение итерируемого объекта.
-
class collections.abc.Iterator -
ABC для классов, которые предоставляют методы
__iter__()и__next__(). См. также определение итератора.
-
class collections.abc.Generator -
ABC для классов-генераторов, которые реализуют протокол, определённый в PEP 342, расширяющий итераторы методами
send(),throw()иclose(). См. также определение генератора.Новое в версии 3.5.
-
class collections.abc.Sequence -
class collections.abc.MutableSequence -
class collections.abc.ByteString -
ABCs для неизменяемых и изменяемых последовательностей.
Примечание для реализации: Некоторые из методов-миксинов, такие как
__iter__(),__reversed__()иindex(), вызывают метод__getitem__()многократно. Следовательно, если метод__getitem__()имеет постоянную скорость доступа, методы-миксины будут иметь линейную производительность; однако, если базовый метод имеет линейную производительность (как в случае со списком ссылок), миксины будут иметь квадратичную производительность и, вероятно, потребуют переопределения.Изменено в версии 3.5: Метод index() получил поддержку аргументов stop и start.
-
class collections.abc.Set -
class collections.abc.MutableSet -
ABCs для неизменяемых и изменяемых множеств.
-
class collections.abc.Mapping -
class collections.abc.MutableMapping -
ABCs для неизменяемых и изменяемых отображений.
-
class collections.abc.MappingView -
class collections.abc.ItemsView -
class collections.abc.KeysView -
class collections.abc.ValuesView -
ABCs для отображений, элементов, ключей и значений представлений.
-
class collections.abc.Awaitable -
ABC для awaitable объектов, которые могут использоваться в выражениях
await. Пользовательские реализации должны предоставить метод__await__().Объекты корутин и экземпляры ABC
Coroutineявляются экземплярами этого ABC.Примечание
В CPython, генераторы-корутины (генераторы, декорированные
types.coroutine()илиasyncio.coroutine()) являются awaitable, даже если у них нет метода__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()) являются awaitable, даже если у них нет метода__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.
Эти ABC позволяют нам узнать, предоставляют ли классы или экземпляры определённые функциональные возможности, например:
size = None
if isinstance(myvar, collections.abc.Sized):
size = len(myvar)
Некоторые из ABC также полезны как миксины, что упрощает разработку классов, поддерживающих контейнерные API. Например, для написания класса, поддерживающего полный Set API, необходимо только предоставить три базовых абстрактных метода: __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.5/library/collections.abc.html