collections.abc —- 容器的抽象基类
3.3 新版功能: 该模块曾是 collections
模块的组成部分。
该模块定义了一些 抽象基类,它们可用于判断一个具体类是否具有某一特定的接口;例如,这个类是否可哈希,或其是否为映射类。
容器抽象基类
这个容器模块提供了以下 ABCs:
抽象基类 | 继承自 | 抽象方法 | 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 | Sized ,Iterable ,Container | contains ,iter ,len | |
Sequence | Reversible ,Collection | getitem ,len | contains , iter , reversed ,index , and count |
MutableSequence | Sequence | getitem ,setitem ,delitem ,len ,insert | 继承自 Sequence 的方法,以及 append , reverse , extend , pop , remove ,和 iadd |
ByteString | Sequence | getitem ,len | 继承自 Sequence 的方法 |
Set | Collection | contains ,iter ,len | le , lt , eq , ne ,gt , ge , and , or ,sub , xor , and isdisjoint |
MutableSet | Set | contains ,iter ,len ,add ,discard | 继承自 Set 的方法以及 clear , pop , remove , ior , iand , ixor ,和 isub |
Mapping | Collection | getitem ,iter ,len | contains , keys , items , values ,get , eq , and 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 ,Collection | 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()
方法的抽象基类。- 提供了
iter()
方法的抽象基类。
使用 isinstance(obj, Iterable)
可以检测一个类是否已经注册到了 Iterable
或者实现了 iter()
函数,但是无法检测这个类是否能够使用 getitem()
方法进行迭代。检测一个对象是否是 iterable 的唯一可信赖的方法是调用 iter(obj)
。
3.6 新版功能.
- class
collections.abc.
Iterator
- 为可迭代类提供了
reversed()
方法的抽象基类。
3.6 新版功能.
- class
collections.abc.
Generator
- 生成器类,实现了 PEP 342 中定义的协议,继承并扩展了迭代器,提供了
send()
,throw()
和close()
方法。参见 generator 的定义。
3.5 新版功能.
- class
collections.abc.
Sequence
- class
collections.abc.
MutableSequence
- class
collections.abc.
ByteString
- 只读且可变的序列 sequences 的抽象基类。
实现笔记:一些混入(Maxin)方法比如 iter()
, reversed()
和 index()
会重复调用底层的 getitem()
方法。因此,如果实现的 getitem()
是常数级访问速度,那么相应的混入方法会有一个线性的表现;然而,如果底层方法是线性实现(例如链表),那么混入方法将会是平方级的表现,这也许就需要被重构了。
在 3.5 版更改: index() 方法支持 stop 和 start 参数。
- class
collections.abc.
Set
- class
collections.abc.
MutableSet
只读且可变的集合的抽象基类。
- class
collections.abc.
MutableMapping
只读且可变的映射 mappings 的抽象基类。
- class
collections.abc.
ItemsView
- class
collections.abc.
KeysView
- class
collections.abc.
ValuesView
映射及其键和值的视图 views 的抽象基类。
- 为可等待对象 awaitable 提供的类,可以被用于
await
表达式中。习惯上必须实现await()
方法。
协程对象 Coroutine 和 Coroutine
抽象基类的实例都是这个抽象基类的实例。
注解
在 CPython 里,基于生成器的协程(使用 types.coroutine()
或 asyncio.coroutine()
包装的生成器)都是 可等待对象,即使他们不含有 await()
方法。使用 isinstance(gencoro, Awaitable)
来检测他们会返回 False
。要使用 inspect.isawaitable()
来检测他们。
3.5 新版功能.
- class
collections.abc.
Coroutine
- 用于协程兼容类的抽象基类。实现了如下定义在 协程对象: 里的方法:
send()
,throw()
和close()
。通常的实现里还需要实现await()
方法。所有的Coroutine
实例都必须是Awaitable
实例。参见 coroutine 的定义。
注解
在 CPython 里,基于生成器的协程(使用 types.coroutine()
或 asyncio.coroutine()
包装的生成器)都是 可等待对象,即使他们不含有 await()
方法。使用 isinstance(gencoro, Coroutine)
来检测他们会返回 False
。要使用 inspect.isawaitable()
来检测他们。
3.5 新版功能.
- class
collections.abc.
AsyncIterable
- 提供了
aiter
方法的抽象基类。参见 asynchronous iterable 的定义。
3.5 新版功能.
- class
collections.abc.
AsyncIterator
- 提供了
aiter
和anext
方法的抽象基类。参见 asynchronous iterator 的定义。
3.5 新版功能.
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
用作混入类时需注意:
由于某些集合操作会创建新集合,默认的混入方法需要一种从可迭代对象里创建新实例的方法。假如其类构造函数签名形如
ClassName(iterable)
,则其会调用一个内部的类方法_from_iterable()
,其中调用了cls(iterable)
来生成一个新集合。如果这个Set
混入类在类中被使用,但其构造函数的签名却是不同的形式,那么你就需要重载_from_iterable()
方法,将其编写成一个类方法,并且它能够从可迭代对象参数中构造一个新实例。重载比较符时时(想必是为了速度,因为其语义都是固定的),只需要重定义
le()
和ge()
函数,然后其他的操作会自动跟进。混入集合类
Set
提供了一个hash()
方法为集合计算哈希值,然而,hash()
函数却没有被定义,因为并不是所有集合都是可哈希并且不可变的。为了使用混入类为集合添加哈希能力,可以同时继承Set()
和Hashable()
类,然后定义_hash
= Set._hash
。
参见
OrderedSet recipe 是基于
MutableSet
构建的一个示例。