You are here:  Home » Python » 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 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__
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()方法添加了对stopstart 参数的支持。

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__() 方法。

协程对象和 CoroutineABC的实例都是这个ABC的实例。

注意

在CPython中,基于生成器的协同程序(用types.coroutine()或装饰的生成器asyncio.coroutine())是 等待的,即使它们没有__await__()方法。使用他们将返回。使用探测到它们。isinstance(gencoro, Awaitable)Falseinspect.isawaitable()

版本3.5中的新功能。

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

注意

在CPython中,基于生成器的协同程序(用types.coroutine()或装饰的生成器asyncio.coroutine())是 等待的,即使它们没有__await__()方法。使用他们将返回。使用探测到它们。isinstance(gencoro, Coroutine)Falseinspect.isawaitable()

版本3.5中的新功能。

collections.abc.AsyncIterable
用于提供__aiter__方法的类的ABC 。另请参见异步iterable的定义。

版本3.5中的新功能。

collections.abc.AsyncIterator
ABC提供的类__aiter____anext__ 方法。另请参见异步迭代器的定义。

版本3.5中的新功能。

collections.abc.AsyncGenerator
用于实现中定义的协议的异步生成器类的ABC PEP 525PEP 492

版本3.6中的新功能。

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

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

 

一些ABCs也可用作mixin,可以更容易地开发支持容器API的类。例如,为了写一个类支持所有SetAPI,它仅需要提供三个底层抽象方法:__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)来产生一个新的集合。如果Setmixin在具有不同构造函数签名的类中使用,则需要_from_iterable() 使用可以从可迭代参数构造新实例的classmethod 来覆盖。
  2. 要覆盖比较(据推测为速度,因为语义是固定的),重新定义__le__()__ge__(),则其他操作会自动效仿。
  3. Set混入提供了一种_hash()计算用于该组的散列值的方法; 但是,__hash__()未定义,因为并非所有集都是可清除的或不可变的。要使用混入添加集hashability,来自继承Set()Hashable(),然后再定义 。__hash__ = Set._hash

也可以看看

  • OrderedSet配方为建立的示例MutableSet
  • 有关ABC的更多信息,请参阅abc模块和PEP 3119