collections.abc与abc模块是同一个东西吗?
emmm…在学习抽象基类时,我们接触的就比python基础更加的底层,于是很多莫名其妙的模块接踵而来。比如首先看到了from collections import abc
,后面又看到了import abc
。就很好奇,两个abc
模块是同一个模块吗?或者它们之间又有什么关系呢?
colletions
这个模块为开发者提供了一系列敏捷、实用的类和方法。用起来也非常方便,具体如下:
从上图我们发现_collections_abc
模块,实际上这是python3之后引入的子模块。但是这跟abc
模块有什么关系呢?还听我通过源码给你娓娓道来。
首先colleticons
是我们的内置模块,所以直接来到python下的Lib文件夹下找
然后点击到__init__.py
下查看
我们发现,在__init__.py
中,我们通过__all__
指定允许外部访问的方法以及类。然后再往下看,在colletions
模块里导入了_collections_abc
的所有方法,并且将__all__
又拼接上了 _collections_abc.__all__
。也就是说,我们可以在collections
里面访问abc
,即collections.abc
。
仍然不能高兴太早,因为现在我们并不确定此abc
是不是彼abc
。所以我们打开
点击_collections_abc
进去,源码如下:
通过源码,其实我们看出来_collections_abc
是从abc
模块中导入了ABCMeta
抽象基类等等。
与此同时,有的朋友还很好奇Lib
下的abc
模块藏着哪些奥秘,我们也一样来看到其源码
奥,搞定。
但是来一个小小的总结啦~
-
collections.abc
中的abc
模块实际上是从Lib/abc
导入抽象基类(ABCMeta
,abstractmethod
),进而封装了一系列有趣的、有自己功能的抽象基类,比如Sized
等 -
Lib/abc
本质就是一个单独模块,是用来定义抽象基类的,也可以说是抽象基类的接口。