Содержание страницы
collections.abc – Абстрактные базовые классы для контейнеров¶collections.abc – Abstract Base Classes for Containers
Новинка версии 3.3: Ранее этот модуль был частью модуля collections.
Исходный код: Lib/_collections_abc.py
Этот модуль предоставляет абстрактные базовые классы, которые можно использовать для проверки, реализует ли класс определённый интерфейс; например, является ли он хешируемым или отображением.
Абстрактные базовые классы коллекций¶Collections Abstract Base Classes
Модуль 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__().Объекты Coroutine и экземпляры 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 также полезны в качестве примесей (mixins), упрощающих разработку
классов, поддерживающих API контейнеров. Например, чтобы написать класс, поддерживающий
полный API Set, достаточно предоставить три основных
абстрактных метода: __contains__(), __iter__() и __len__().
ABC предоставляет остальные методы, такие как __and__() и
isdisjoint():
class ListBasedSet(collections.abc.Set):
''' Альтернативная реализация множества, ориентированная на экономию памяти, а не на скорость
и не требующая, чтобы элементы множества были хэшируемыми. '''
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 # Метод __and__() поддерживается автоматически
Замечания по использованию 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и .