8.4. collections.abc
—— 容器的抽象基类¶
版本3.3中的新功能:以前,此模块是collections
模块的一部分。
源码位置: Lib/_collections_abc.py
此模块提供抽象基类,可用于测试类是否提供特定接口;例如,它是否是哈希表或者它是否是映射。
8.4.1.容器抽象基类¶
collections模块提供以下抽象基类:
抽象基类 | 继承自 | 抽象的方法 | Mixin方法 |
---|---|---|---|
Container | __contains__ | ||
Hashable | __hash__ | ||
Iterable | __iter__ | ||
Iterator | Iterable | __next__ | __iter__ |
Generator | Iterator | send ,throw | close ,__iter__ ,__next__ |
Sized | __len__ | ||
Callable | __call__ | ||
Sequence | Sized ,Iterable ,Container | __getitem__ ,__len__ | __contains__ ,__iter__ ,__reversed__ ,index 和count |
MutableSequence | Sequence | __getitem__ , __setitem__ , __delitem__ , __len__ , insert | Inherited Sequence methods and append , reverse , extend , pop , remove , and __iadd__ |
ByteString | Sequence | __getitem__ ,__len__ | 继承Sequence 方法 |
Set | Sized ,Iterable ,Container | __contains__ ,__iter__ ,__len__ | __le__ , __lt__ , __eq__ , __ne__ , __gt__ , __ge__ , __and__ , __or__ , __sub__ , __xor__ , and isdisjoint |
MutableSet | Set | __contains__ ,__iter__ ,__len__ ,add ,discard | Inherited Set methods and clear , pop , remove , __ior__ , __iand__ , __ixor__ , and __isub__ |
Mapping | Sized ,Iterable ,Container | __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 | __contains__ ,__iter__ | |
Awaitable | __await__ | ||
Coroutine | Awaitable | send ,throw | close |
AsyncIterable | __aiter__ | ||
AsyncIterator | AsyncIterable | __anext__ | __aiter__ |
- class
collections.abc.
Container
¶ - class
collections.abc.
Hashable
¶ - class
collections.abc.
Sized
¶ - class
collections.abc.
Callable
¶ 分别为类提供
__contains__()
、__hash__()
、__len__()
和__call__()
方法的抽象基类。
- class
collections.abc.
Iterable
¶ 提供
__iter__()
方法的类的ABC。另请参见iterable的定义。
- class
collections.abc.
Iterator
¶ 提供
__iter__()
和__next__()
方法的类的ABC。另请参见iterator的定义。
- class
collections.abc.
Generator
¶ ABC for generator classes that implement the protocol defined in PEP 342 that extends iterators with the
send()
,throw()
andclose()
methods. 另见generator的定义。版本3.5中的新功能。
- class
collections.abc.
Sequence
¶ - class
collections.abc.
MutableSequence
¶ - class
collections.abc.
ByteString
¶ 只读和可变sequences的ABCs。
实现注意:一些mixin方法,如
__iter__()
,__reversed__()
和index()
__getitem__()
方法。因此,如果__getitem__()
以常量访问速度实现,则mixin方法将具有线性性能;然而,如果底层方法是线性的(因为它将与一个链表),mixins将具有二次性能,可能需要重写。在版本3.5中更改: index()方法添加了对停止和开始参数的支持。
- class
collections.abc.
MappingView
¶ - class
collections.abc.
ItemsView
¶ - class
collections.abc.
KeysView
¶ - class
collections.abc.
ValuesView
¶ ABCs for mapping, items, keys, and values views.
- class
collections.abc.
Awaitable
¶ 用于awaitable对象的ABC,可用于
await
表达式中。自定义实现必须提供__ await __()
方法。注意
在CPython中,基于生成器的协程(用
types.coroutine()
或asyncio.coroutine()
装饰的生成器)是awaitables他们没有__ await __()
方法。使用isinstance(gencoro, Awaitable)
,将返回False
。使用inspect.isawaitable()
检测它们。版本3.5中的新功能。
- class
collections.abc.
Coroutine
¶ 协程兼容类ABC。这些实现在协程对象中定义的以下方法:
send()
,throw()
,和close()
。自定义实现还必须实现__ await __()
。所有协程
实例也是Awaitable
的实例。另见协程的定义。注意
在CPython中,基于生成器的协程(
types.coroutine()
或asyncio.coroutine()
装饰的生成器是awaitables虽然他们没有__await__()
方法。使用isinstance(gencoro, 协程)
,将返回False
。使用inspect.isawaitable()
检测它们。版本3.5中的新功能。
- class
collections.abc.
AsyncIterable
¶ ABC提供
__aiter__
方法的类。另请参见asynchronous iterable的定义。版本3.5中的新功能。
- class
collections.abc.
AsyncIterator
¶ 提供
__aiter__
和__anext__
方法的类的ABC。另请参见asynchronous iterator的定义。版本3.5中的新功能。
这些ABC允许我们询问类或实例,如果它们提供特定的功能,例如:
size = None
if isinstance(myvar, collections.abc.Sized):
size = len(myvar)
几个ABCs也可用作mixin,使得更容易开发支持容器API的类。For example, to write a class supporting the full Set
API, it is only necessary to supply the three underlying abstract methods: __contains__()
, __iter__()
, and __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
作为混合的注意事项:
- 因为一些集合操作创建新集合,所以默认的mixin方法需要一种从迭代中创建新实例的方法。类构造函数假定具有
ClassName(iterable)
形式的声明。该假设被分解为调用cls(iterable)
的一个名为_from_iterable()
的内部类方法,以产生一个新集合。如果在具有不同构造函数声明的类中使用Set
mixin,则需要使用可以从可迭代参数构造新实例的类方法覆盖_from_iterable()
- 要覆盖比较(假定为速度,因为语义是固定的),重新定义
__le__()
和__ge__()
,则其他操作将自动跟随。 Set
mixin提供了一个_hash()
方法来计算集合的哈希值;然而,__hash__()
未定义,因为并非所有集都是可哈希的或不可变的。要使用mixins添加集合散列,请继承Set()
和Hashable()
,然后定义__ hash __ = Set._hash
。
也可以看看
- OrderedSet recipe用于构建在
MutableSet
上的示例。 - 有关ABCs的更多信息,请参阅
abc
模块和 PEP 3119。