collections.abc与abc模块是同一个东西吗?

emmm…在学习抽象基类时,我们接触的就比python基础更加的底层,于是很多莫名其妙的模块接踵而来。比如首先看到了from collections import abc,后面又看到了import abc。就很好奇,两个abc模块是同一个模块吗?或者它们之间又有什么关系呢?

colletions这个模块为开发者提供了一系列敏捷、实用的类和方法。用起来也非常方便,具体如下:
collections.abc与abc模块是同一个东西吗?
从上图我们发现_collections_abc模块,实际上这是python3之后引入的子模块。但是这跟abc模块有什么关系呢?还听我通过源码给你娓娓道来。

首先colleticons是我们的内置模块,所以直接来到python下的Lib文件夹下找

collections.abc与abc模块是同一个东西吗?

然后点击到__init__.py下查看
collections.abc与abc模块是同一个东西吗?
我们发现,在__init__.py中,我们通过__all__指定允许外部访问的方法以及类。然后再往下看,在colletions模块里导入了_collections_abc的所有方法,并且将__all__又拼接上了 _collections_abc.__all__。也就是说,我们可以在collections里面访问abc,即collections.abc

仍然不能高兴太早,因为现在我们并不确定此abc是不是彼abc。所以我们打开

collections.abc与abc模块是同一个东西吗?
collections.abc与abc模块是同一个东西吗?
点击_collections_abc进去,源码如下:

collections.abc与abc模块是同一个东西吗?
通过源码,其实我们看出来_collections_abc是从abc模块中导入了ABCMeta抽象基类等等。

与此同时,有的朋友还很好奇Lib下的abc模块藏着哪些奥秘,我们也一样来看到其源码

collections.abc与abc模块是同一个东西吗?
奥,搞定。

但是来一个小小的总结啦~

  • collections.abc中的abc模块实际上是从Lib/abc导入抽象基类(ABCMetaabstractmethod),进而封装了一系列有趣的、有自己功能的抽象基类,比如Sized
  • Lib/abc本质就是一个单独模块,是用来定义抽象基类的,也可以说是抽象基类的接口。