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__, потому что оператор вхождения, логика итерации и функция 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 Абстрактные базовые классы
Модуль 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 для классов-контейнеров с итерируемыми размерами.
Добавлен в версии 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.
Устаревшее с версии 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. Кастомные реализации должны предоставлять метод__await__().Объекты корутины и экземпляры ABC
Coroutineявляются экземплярами этого ABC.Примечание
В CPython генераторные корутины (генераторы, декорированные
@types.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) являются 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.
-
class collections.abc.AsyncGenerator -
ABC для классов асинхронных генераторов, которые реализуют протокол, определённый в PEP 525 и PEP 492.
Добавлена в версии 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.12/library/collections.abc.html