该模块提供抽象基类,可用于测试类是否提供特定接口;例如,这个类是否可哈希,或其是否为映射类。

集合抽象基类

集合模块提供以下抽象基类:

抽象基类 继承自 抽象方法 Mixin方法
Container __contains__
Hashable __hash__
Iterable __iter__
Iterator Iterable __next__ __iter__
Reversible Iterable __reversed__
Generator Iterator send, throw close__iter____next__
Sized __len__
Callable __call__
Collection SizedIterableContainer __contains____iter____len__
Sequence ReversibleCollection __getitem____len__ __contains____iter____reversed__index,和count
MutableSequence Sequence __getitem____setitem____delitem____len__, insert 继承Sequence方法和 appendreverseextendpop, remove,和__iadd__
ByteString Sequence __getitem____len__ 继承Sequence方法
Set Collection __contains____iter____len__ __le____lt____eq____ne____gt____ge____and____or____sub____xor__,和isdisjoint
MutableSet Set __contains____iter____len__, adddiscard 继承Set方法和 clearpopremove__ior__, __iand____ixor__,和__isub__
Mapping Collection __getitem____iter____len__ __contains__keysitemsvaluesget__eq__,和__ne__
MutableMapping Mapping __getitem____setitem____delitem____iter____len__ 继承Mapping方法和 poppopitemclearupdate,和setdefault
MappingView Sized __len__
ItemsView MappingViewSet __contains__, __iter__
KeysView MappingViewSet __contains__, __iter__
ValuesView MappingViewCollection __contains__, __iter__
Awaitable __await__
Coroutine Awaitable send, throw close
AsyncIterable __aiter__
AsyncIterator AsyncIterable __anext__ __aiter__
AsyncGenerator AsyncIterator asend, athrow aclose__aiter____anext__
class collections.abc.Container
class collections.abc.Hashable
class collections.abc.Sized
class collections.abc.Callable
分别提供方法__contains__()、 __hash__()__len__()和的类的基础知识__call__()
classcollections.abc.Iterable
提供了 __iter__() 方法的抽象基类。

检查 isinstance(obj, Iterable) 会检测注册为 Iterable 或具有 __iter__() 方法的类,但不会检测使用 __getitem__() 方法迭代的类。 确定对象是否可迭代的唯一可靠方法是调用 iter(obj)。

classcollections.abc.Collection
集合了 Sized 和 Iterable 类的抽象基类。

版本3.6中的新功能。

classcollections.abc.Iterator
提供了 __iter__() 和 __next__() 方法的抽象基类。参见 iterator 的定义
classcollections.abc.Reversible
为可迭代类提供了 __reversed__() 方法的抽象基类。

版本3.6中的新功能。

classcollections.abc.Generator
生成器类,实现了 PEP 342 中定义的协议,继承并扩展了迭代器,提供了 send()throw() 和 close() 方法。参见 generator 的定义。

版本3.5中的新功能。

classcollections.abc.Sequence
classcollections.abc.MutableSequence
classcollections.abc.ByteString
只读且可变的序列 sequences 的抽象基类。

实现注意事项:一些 mixin 方法,例如 __iter__()、__reversed__() 和 index(),会重复调用底层的 __getitem__() 方法。 因此,如果 __getitem__() 以恒定的访问速度实现,则 mixin 方法将具有线性性能; 然而,如果底层方法是线性的(就像链表一样),mixins 将具有二次性能并且可能需要被覆盖。

在 3.5 版更改: index() 方法添加了对停止和启动参数的支持。

classcollections.abc.Set
classcollections.abc.MutableSet
只读且可变的集合的抽象基类。
classcollections.abc.Mapping
classcollections.abc.MutableMapping
只读且可变的映射 mappings 的抽象基类。
classcollections.abc.MappingView
classcollections.abc.ItemsView
classcollections.abc.KeysView
classcollections.abc.ValuesView
映射及其键和值的视图 views 的抽象基类。
classcollections.abc.Awaitable
为可等待对象 awaitable 提供的类,可以被用于 await 表达式中。习惯上必须实现 __await__() 方法。

协程对象 Coroutine 和 Coroutine 抽象基类的实例都是这个抽象基类的实例。

注意

在 CPython 里,基于生成器的协程(使用 types.coroutine() 或 asyncio.coroutine() 包装的生成器)都是 可等待对象,即使他们不含有 __await__() 方法。使用 isinstance(gencoro, Awaitable) 来检测他们会返回 False。要使用 inspect.isawaitable() 来检测他们。

版本3.5中的新功能。

classcollections.abc.Coroutine
用于协程兼容类的ABC。这些实现以下方法,在定义协程对象: send()throw(),和 close()。自定义实现也必须实现 __await__()。所有Coroutine实例也是实例 Awaitable。另见coroutine的定义。

注意

在 CPython 里,基于生成器的协程(使用 types.coroutine() 或 asyncio.coroutine() 包装的生成器)都是 可等待对象,即使他们不含有 __await__() 方法。使用 isinstance(gencoro, Coroutine) 来检测他们会返回 False。要使用 inspect.isawaitable() 来检测他们。

版本3.5中的新功能。

classcollections.abc.AsyncIterable
提供了 __aiter__ 方法的抽象基类。参见 asynchronous iterable 的定义。

版本3.5中的新功能。

classcollections.abc.AsyncIterator
提供了 __aiter__ 和 __anext__ 方法的抽象基类。参见 asynchronous iterator 的定义。

版本3.5中的新功能。

classcollections.abc.AsyncGenerator
为异步生成器类提供的抽象基类,这些类实现了定义在 PEP 525 和 PEP 492 里的协议。

版本3.6中的新功能。

这些抽象基类让我们可以确定类和示例拥有某些特定的函数,例如:

size = None
if isinstance(myvar, collections.abc.Sized):
    size = len(myvar)

有些抽象基类也可以用作混入类(mixin),这可以更容易地开发支持容器 API 的类。例如,要写一个支持完整 Set API 的类,只需要提供下面这三个方法: __contains__()__iter__() 和 __len__()。抽象基类会补充上其余的方法,比如 __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 用作混入类时需注意:

  1. 由于某些集合操作会创建新集合,默认的混入方法需要一种从可迭代对象里创建新实例的方法。假如其类构造函数签名形如 ClassName(iterable) ,则其会调用一个内部的类方法 _from_iterable(),其中调用了 cls(iterable) 来生成一个新集合。如果这个 Set 混入类在类中被使用,但其构造函数的签名却是不同的形式,那么你就需要重载 _from_iterable() 方法,将其编写成一个类方法,并且它能够从可迭代对象参数中构造一个新实例。
  2. 重载比较符时时(想必是为了速度,因为其语义都是固定的),只需要重定义 __le__() 和 __ge__() 函数,然后其他的操作会自动跟进。
  3. 混入集合类 Set 提供了一个 _hash() 方法为集合计算哈希值,然而, __hash__() 函数却没有被定义,因为并不是所有集合都是可哈希并且不可变的。为了使用混入类为集合添加哈希能力,可以同时继承 Set() 和 Hashable() 类,然后定义 __hash__ = Set._hash

 

也可以看看

  • OrderedSet recipe 是基于 MutableSet 构建的一个示例。
  • 有关抽象基类的更多信息,请参阅抽象基类模块。