Документация Python неофициальный перевод
Содержание страницы

8.4. collections.abc – Абстрактные базовые классы для контейнеровcollections.abc – Abstract Base Classes for Containers

Новое в версии 3.3: Ранее этот модуль был частью модуля collections.

Исходный код: Lib/collections/abc.py


Этот модуль предоставляет абстрактные базовые классы, которые можно использовать для проверки, реализует ли класс определённый интерфейс; например, является ли он хешируемым или отображением.

8.4.1. Абстрактные базовые классы коллекцийCollections Abstract Base Classes

Модуль collections предоставляет следующие абстрактные базовые классы:

ABC Наследует от Абстрактные методы Методы-примеси
Container   __contains__  
Hashable   __hash__  
Iterable   __iter__  
Iterator Iterable __next__ __iter__
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__
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__
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__(). См. также определение итерируемого объекта.

class collections.abc.Iterator

ABC для классов, предоставляющих методы __iter__() и __next__(). См. также определение итератора.

class collections.abc.Sequence
class collections.abc.MutableSequence

ABC для неизменяемых и изменяемых последовательностей.

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 для представлений отображений, элементов, ключей и значений.

Эти 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):
     ''' Альтернативная реализация множества, ориентированная на экономию памяти, а не на скорость
         и не требующая, чтобы элементы множества были хэшируемыми. '''
     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 в качестве миксина:

  1. Поскольку некоторые операции над множествами создают новые множества, методам миксина по умолчанию требуется способ создавать новые экземпляры из итерируемого объекта. Предполагается, что конструктор класса имеет сигнатуру вида ClassName(iterable). Это предположение вынесено во внутренний метод класса _from_iterable(), который вызывает cls(iterable) для создания нового множества. Если миксин Set используется в классе с другой сигнатурой конструктора, потребуется переопределить _from_iterable() методом класса, который сможет создавать новые экземпляры из итерируемого аргумента.
  2. Чтобы переопределить операции сравнения (предположительно для скорости, так как семантика фиксирована), переопределите __le__(), и остальные операции автоматически последуют этому примеру.
  3. Примесь Set предоставляет метод _hash() для вычисления хеш-значения множества; однако __hash__() не определён, поскольку не все множества являются хешируемыми или неизменяемыми. Чтобы добавить хешируемость множеству с помощью примесей, унаследуйтесь от Set() и Hashable(), затем определите __hash__ = Set._hash.

См. также

  • Рецепт OrderedSet для примера, построенного на основе MutableSet.
  • Для получения дополнительной информации об ABC см. модуль abc и PEP 3119.