collections.abc-容器的抽象基类详解(33)Python语言(必读进阶学习教程)(参考资料)
版本3.3中的新功能:以前,此模块是模块的一部分collections
。
源代码: Lib / _collections_abc.py
该模块提供了抽象基类,可用于测试类是否提供特定接口; 例如,它是否可以清除或是否是映射。
集合抽象基类
集合模块提供以下ABC:
ABC | 继承自 | 抽象方法 | 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 ,和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__ ,和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__ ,和__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__ |
- 类
collections.abc.
Container
- 类
collections.abc.
Hashable
- 类
collections.abc.
Sized
- 类
collections.abc.
Callable
- 对于类的ABC分别提供的方法
__contains__()
,__hash__()
,__len__()
,和__call__()
。
- 类
collections.abc.
Iterable
- 提供
__iter__()
方法的类的ABC 。检查检测到已注册为或具有方法的类,但它不检测使用该方法迭代的类。确定对象是否可迭代的唯一可靠方法是调用。
isinstance(obj, Iterable)
Iterable
__iter__()
__getitem__()
iter(obj)
- 类
collections.abc.
Collection
- ABC用于大小可迭代的容器类。
版本3.6中的新功能。
- 类
collections.abc.
Iterator
- 用于提供
__iter__()
和__next__()
方法的类的ABC 。另请参见迭代器的定义 。
- 类
collections.abc.
Reversible
- ABC也用于可提供
__reversed__()
方法的可迭代类。版本3.6中的新功能。
- 类
collections.abc.
Generator
- 用于实现在中定义的协议的生成器类的ABC PEP 342延伸与所述迭代器
send()
,throw()
和close()
方法。另见发电机的定义。版本3.5中的新功能。
- 类
collections.abc.
Sequence
- 类
collections.abc.
MutableSequence
- 类
collections.abc.
ByteString
- ABCs用于只读和可变序列。
实现说明:一些mixin方法,例如
__iter__()
,__reversed__()
和index()
,重复调用底层__getitem__()
方法。因此,如果__getitem__()
以恒定的访问速度实现,mixin方法将具有线性性能; 但是,如果底层方法是线性的(就像链表一样),mixins将具有二次性能,并且可能需要被覆盖。版本3.5中已更改: index()方法添加了对stop和start 参数的支持。
- 类
collections.abc.
Set
- 类
collections.abc.
MutableSet
- 用于只读和可变集的ABC。
- 类
collections.abc.
Mapping
- 类
collections.abc.
MutableMapping
- 用于只读和可变映射的 ABC 。
- 类
collections.abc.
MappingView
- 类
collections.abc.
ItemsView
- 类
collections.abc.
KeysView
- 类
collections.abc.
ValuesView
- 用于映射,项目,键和值视图的 ABC 。
- 类
collections.abc.
Awaitable
- 用于等待对象的ABC ,可以在
await
表达式中使用。自定义实现必须提供该__await__()
方法。协程对象和
Coroutine
ABC的实例都是这个ABC的实例。注意
在CPython中,基于生成器的协同程序(用
types.coroutine()
或装饰的生成器asyncio.coroutine()
)是 等待的,即使它们没有__await__()
方法。使用他们将返回。使用探测到它们。isinstance(gencoro, Awaitable)
False
inspect.isawaitable()
版本3.5中的新功能。
- 类
collections.abc.
Coroutine
- 用于协程兼容类的ABC。这些实现以下方法,在定义协程对象:
send()
,throw()
,和close()
。自定义实现也必须实现__await__()
。所有Coroutine
实例也是实例Awaitable
。另见coroutine的定义。注意
在CPython中,基于生成器的协同程序(用
types.coroutine()
或装饰的生成器asyncio.coroutine()
)是 等待的,即使它们没有__await__()
方法。使用他们将返回。使用探测到它们。isinstance(gencoro, Coroutine)
False
inspect.isawaitable()
版本3.5中的新功能。
- 类
collections.abc.
AsyncIterable
- 用于提供
__aiter__
方法的类的ABC 。另请参见异步iterable的定义。版本3.5中的新功能。
- 类
collections.abc.
AsyncIterator
- ABC提供的类
__aiter__
和__anext__
方法。另请参见异步迭代器的定义。版本3.5中的新功能。
- 类
collections.abc.
AsyncGenerator
- 用于实现中定义的协议的异步生成器类的ABC PEP 525和PEP 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
关于使用Set
和MutableSet
作为混音的说明:
- 由于某些集合操作会创建新集合,因此默认的mixin方法需要一种从迭代中创建新实例的方法。假定类构造函数在表单中具有签名
ClassName(iterable)
。这个假设被分解为一个内部的类方法,调用_from_iterable()
它cls(iterable)
来产生一个新的集合。如果Set
mixin在具有不同构造函数签名的类中使用,则需要_from_iterable()
使用可以从可迭代参数构造新实例的classmethod 来覆盖。 - 要覆盖比较(据推测为速度,因为语义是固定的),重新定义
__le__()
和__ge__()
,则其他操作会自动效仿。 Set
混入提供了一种_hash()
计算用于该组的散列值的方法; 但是,__hash__()
未定义,因为并非所有集都是可清除的或不可变的。要使用混入添加集hashability,来自继承Set()
和Hashable()
,然后再定义 。__hash__ = Set._hash
也可以看看
- OrderedSet配方为建立的示例
MutableSet
。 - 有关ABC的更多信息,请参阅
abc
模块和PEP 3119。