collections.abc — Абстрактные базовые классы для контейнеров
Добавлен в версии 3.3: Ранее этот модуль был частью модуля collections.
Исходный код: Lib/_collections_abc.py
Этот модуль предоставляет абстрактные базовые классы, которые могут использоваться для проверки, предоставляет ли класс определённый интерфейс; например, является ли он хешируемым или является ли он отображением.
Тест issubclass() или isinstance() для интерфейса работает одним из трёх способов.
1) Новый класс может быть унаследован непосредственно от одного из абстрактных базовых классов. Класс должен предоставить необходимые абстрактные методы. Остальные методы-микшины наследуются и могут быть переопределены, если это необходимо. Другие методы могут быть добавлены по мере необходимости:
class C(Sequence): # Direct inheritance
def __init__(self): ... # Extra method not required by the ABC
def __getitem__(self, index): ... # Required abstract method
def __len__(self): ... # Required abstract method
def count(self, value): ... # Optionally override a mixin method
>>> issubclass(C, Sequence) True >>> isinstance(C(), Sequence) True
2) Существующие классы и встроенные классы могут быть зарегистрированы как «виртуальные подклассы» ABC. Эти классы должны определять весь API, включая все абстрактные методы и все методы-микшины. Это позволяет пользователям полагаться на тесты issubclass() или isinstance(), чтобы определить, поддерживается ли полный интерфейс. Исключением из этого правила являются методы, которые автоматически вычисляются из остальной части API:
class D: # No inheritance
def __init__(self): ... # Extra method not required by the ABC
def __getitem__(self, index): ... # Abstract method
def __len__(self): ... # Abstract method
def count(self, value): ... # Mixin method
def index(self, value): ... # Mixin method
Sequence.register(D) # Register instead of inherit
>>> issubclass(D, Sequence) True >>> isinstance(D(), Sequence) True
В этом примере классу D не нужно определять __contains__, __iter__, и __reversed__, потому что оператор in, логика итерации и функция reversed() автоматически обращаются к использованию __getitem__ и __len__.
3) Некоторые простые интерфейсы напрямую распознаются по наличию необходимых методов (если эти методы не установлены в None):
class E:
def __iter__(self): ...
def __next__(self): ...
>>> issubclass(E, Iterable) True >>> isinstance(E(), Iterable) True
Сложные интерфейсы не поддерживают последний метод, так как интерфейс подразумевает не только наличие имён методов. Интерфейсы определяют семантику и отношения между методами, которые нельзя вывести только из наличия конкретных имён методов. Например, знание о том, что класс предоставляет __getitem__, __len__, и __iter__, недостаточно для отличия Sequence от Mapping.
Добавлен в версии 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__().См. Аннотирование вызываемых объектов для подробностей о том, как использовать
Callableв аннотациях типов.
-
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().См. Аннотирование генераторов и сопроцедур для подробностей о использовании
Generatorв аннотациях типов.Добавлен в версии 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.Устарело начиная с версии 3.12, будет удалено в версии 3.14: ABC
ByteStringустарел. Для использования в типизации предпочтительнее использовать объединение, напримерbytes | bytearray, илиcollections.abc.Buffer. Для использования в качестве ABC предпочтительнееSequenceилиcollections.abc.Buffer.
-
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) являются ожидаемыми, даже если у них нет метода__await__(). Использованиеisinstance(gencoro, Awaitable)для них вернётFalse. Для их обнаружения используйтеinspect.isawaitable().Добавлен в версии 3.5.
-
class collections.abc.Coroutine -
ABC для совместимых с корутиной классов. Они реализуют следующие методы, определённые в Объектах корутины:
send(),throw()иclose(). Пользовательские реализации также должны реализовать__await__(). Все экземплярыCoroutineтакже являются экземплярамиAwaitable.Примечание
В CPython, корутины на основе генераторов (генераторы, декорированные
@types.coroutine) являются awaitable, даже если у них нет метода__await__(). Использованиеisinstance(gencoro, Coroutine)для них вернётFalse. Используйтеinspect.isawaitable()для их обнаружения.См. Аннотирование генераторов и корутин для подробностей об использовании
Coroutineв аннотациях типов. Изменчивость и порядок параметров типа соответствуют таковым дляGenerator.Добавлена в версии 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.
См. Аннотирование генераторов и корутин для подробностей об использовании
AsyncGeneratorв аннотациях типов.Добавлена в версии 3.6.
-
class collections.abc.Buffer -
ABC для классов, предоставляющих метод
__buffer__(), реализующий протокол буфера. См. PEP 688.Добавлена в версии 3.12.
Примеры и рецепты
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). Это предположение реализовано в виде внутреннегоclassmethodпод названием_from_iterable(), который вызываетcls(iterable)для создания нового множества. Если миксинSetиспользуется в классе с другим сигнатурой конструктора, вам потребуется переопределить_from_iterable()с помощью метода класса или обычного метода, который может создавать новые экземпляры из итерируемого аргумента. - Для переопределения сравнений (вероятно, для повышения скорости, так как семантика фиксирована), переопределите
__le__()и__ge__(), тогда остальные операции автоматически последуют. - Миксин
Setпредоставляет метод_hash()для вычисления значения хеша множества; однако,__hash__()не определён, потому что не все множества являются хешируемыми или неизменяемыми. Для добавления хеширования множеств с помощью миксинов, наследуйте как отSet(), так и отHashable(), затем определите__hash__ = Set._hash.
См. также
-
Рецепт OrderedSet для примера, построенного на основе
MutableSet. - Для получения дополнительной информации об ABC, обратитесь к модулю
abcи PEP 3119.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/collections.abc.html