Skip to main content

8.4. collections.abc —容器的抽象基类

3.3 新版功能: 以前,该模块是 collections 模块的一部分。

源代码: Lib/_collections_abc.py


此模块提供了 抽象基类,可用于测试类是否提供特定接口;例如,它是否是哈希表或者它是否是映射。

8.4.1. 集合抽象基类

collections模块提供以下 ABCs

ABC

继承自

摘要方法

混合方法

Container

 

__contains__

 

Hashable

 

__hash__

 

Iterable

 

__iter__

 

Iterator

Iterable

__next__

__iter__

Reversible

Iterable

__reversed__

 

Generator

Iterator

sendthrow

close__iter____next__

Sized

 

__len__

 

Callable

 

__call__

 

Collection

SizedIterableContainer

__contains____iter____len__

 

Sequence

ReversibleCollection

__getitem____len__

__contains____iter____reversed__indexcount

MutableSequence

Sequence

__getitem____setitem____delitem____len__insert

继承 Sequence 方法和 appendreverseextendpopremove__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 方法和 poppopitemclearupdatesetdefault

MappingView

Sized

 

__len__

ItemsView

MappingViewSet

 

__contains____iter__

KeysView

MappingViewSet

 

__contains____iter__

ValuesView

MappingView

 

__contains____iter__

Awaitable

 

__await__

 

Coroutine

Awaitable

sendthrow

close

AsyncIterable

 

__aiter__

 

AsyncIterator

AsyncIterable

__anext__

__aiter__

AsyncGenerator

AsyncIterator

asendathrow

aclose__aiter____anext__

class collections.abc.Container
class collections.abc.Hashable
class collections.abc.Sized
class collections.abc.Callable

ABCs,分别提供方法 __contains__()__hash__()__len__()__call__()

class collections.abc.Iterable

ABC提供 __iter__() 方法的类。参见 iterable 的定义。

class collections.abc.Collection

ABC用于大小可迭代容器类。

3.6 新版功能.

class collections.abc.Iterator

ABC提供 __iter__()__next__() 方法的类。参见 iterator 的定义。

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

只读和可变 序列 的ABCs。

实现注意:一些mixin方法,如 __iter__()__reversed__()index(),重复调用基本的 __getitem__() 方法。因此,如果 __getitem__() 以恒定的访问速度实现,则mixin方法将具有线性性能;然而,如果底层方法是线性的(因为它将与一个链表),mixins将具有二次性能,可能需要重写。

在 3.5 版更改: index()方法添加了对 stopstart 参数的支持。

class collections.abc.Set
class collections.abc.MutableSet

ABCs用于只读和可变集。

class collections.abc.Mapping
class collections.abc.MutableMapping

只读和可变 映射 的ABCs。

class collections.abc.MappingView
class collections.abc.ItemsView
class collections.abc.KeysView
class collections.abc.ValuesView

用于映射,项,键和值的ABC 视图

class collections.abc.Awaitable

ABC用于 awaitable 对象,可用于 await 表达式。自定义实现必须提供 __await__() 方法。

Coroutine 对象和 Coroutine ABC的实例都是此ABC的实例。

注解

在CPython中,基于生成器的协同程序(用 types.coroutine()asyncio.coroutine() 装饰的生成器)是 awaitables,即使它们没有 __await__() 方法。使用 isinstance(gencoro, Awaitable) 为他们将返回 False。使用 inspect.isawaitable() 来检测它们。

3.5 新版功能.

class collections.abc.Coroutine

ABC用于协程兼容类。这些实现了在 协同对象 中定义的以下方法:send()throw()close()。自定义实现还必须实现 __await__()。所有 Coroutine 实例也是 Awaitable 的实例。参见 coroutine 的定义。

注解

在CPython中,基于生成器的协同程序(用 types.coroutine()asyncio.coroutine() 装饰的生成器)是 awaitables,即使它们没有 __await__() 方法。使用 isinstance(gencoro, Coroutine) 为他们将返回 False。使用 inspect.isawaitable() 来检测它们。

3.5 新版功能.

class collections.abc.AsyncIterable

ABC提供 __aiter__ 方法的类。参见 asynchronous iterable 的定义。

3.5 新版功能.

class collections.abc.AsyncIterator

ABC提供 __aiter____anext__ 方法的类。参见 asynchronous iterator 的定义。

3.5 新版功能.

class collections.abc.AsyncGenerator

ABC用于实现 PEP 525PEP 492 中定义的协议的异步发电机类。

3.6 新版功能.

例如,这些ABC允许我们询问类或实例,如果它们提供特定的功能:

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

几个ABCs也可用作mixin,使得更容易开发支持容器API的类。例如,要编写支持完整 Set API的类,只需要提供三个基本抽象方法:__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

使用 SetMutableSet 作为混音的注意事项:

  1. 因为一些集合操作创建新集合,所以默认的mixin方法需要一种从迭代中创建新实例的方法。假设类构造函数具有 ClassName(iterable) 形式的签名。该假设被分解为称为 _from_iterable() 的内部类方法,该方法调用 cls(iterable) 以产生新的集合。如果 Set mixin被用在具有不同构造函数签名的类中,则需要使用可以从可迭代参数构造新实例的类方法覆盖 _from_iterable()

  2. 为了覆盖比较(假定为速度,语义是固定的),重新定义 __le__()__ge__(),则其他操作将自动跟随。

  3. Set 混合提供了一种 _hash() 方法来计算集合的哈希值;然而,没有定义 __hash__(),因为不是所有的集合都是hashable或不可变的。要使用mixins添加集合哈希,继承 Set()Hashable(),然后定义 __hash__ = Set._hash

参见