collections.abc — Абстрактные базовые классы для контейнеров
Новое в версии 3.3: Ранее этот модуль был частью модуля collections.
Исходный код: Lib/_collections_abc.py
Этот модуль предоставляет абстрактные базовые классы, которые могут использоваться для проверки, предоставляет ли класс определённый интерфейс; например, является ли он хешируемым или является ли он отображением.
Новое в версии 3.9: Эти абстрактные классы теперь поддерживают []. См. Тип обобщённого псевдонима и PEP 585.
Абстрактные базовые классы коллекций
Модуль collections предлагает следующие ABC:
ABC | Наследует от | Абстрактные методы | Методы-миксины |
|---|---|---|---|
| |||
| |||
| |||
|
| ||
| |||
|
| ||
| |||
| |||
| |||
|
| ||
| Наследуемые | ||
| Наследуемые | ||
|
| ||
| Наследуемые | ||
|
| ||
| Наследуемые | ||
| |||
| |||
| |||
| |||
| |||
|
| ||
| |||
|
| ||
|
|
-
class collections.abc.Container -
ABC для классов, предоставляющих метод
__contains__().
-
class collections.abc.Hashable -
ABC для классов, предоставляющих метод
__hash__().
-
class collections.abc.Sized -
ABC для классов, предоставляющих метод
__len__().
-
class collections.abc.Callable -
ABC для классов, предоставляющих метод
__call__().
-
class collections.abc.Iterable -
ABC для классов, предоставляющих метод
__iter__().Проверка
isinstance(obj, Iterable)определяет классы, зарегистрированные какIterable, или имеющие метод__iter__(), но не определяет классы, которые итерируются с помощью метода__getitem__(). Единственный надёжный способ определить, является ли объект итерируемым, заключается в вызовеiter(obj).
-
class collections.abc.Collection -
ABC для классов контейнеров, которые являются итерируемыми и имеют размер.
New in version 3.6.
-
class collections.abc.Iterator -
ABC для классов, предоставляющих методы
__iter__()и__next__(). Смотрите также определение итератора.
-
class collections.abc.Reversible -
ABC для итерируемых классов, которые также предоставляют метод
__reversed__().New in version 3.6.
-
class collections.abc.Generator -
ABC для классов-генераторов, которые реализуют протокол, определенный в PEP 342, который расширяет итераторы методами
send(),throw()иclose(). Смотрите также определение генератора.New in version 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()для их обнаружения.New in version 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()для их обнаружения.New in version 3.5.
-
class collections.abc.AsyncIterable -
ABC для классов, предоставляющих метод
__aiter__. Смотрите также определение асинхронного итерируемого объекта.New in version 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/collections.abc.html