在使用Python的过程中,经常会被模块、库、包、框架这几个概念搞混。今天抽时间对这几个概念做下梳理。
模块(Module)
模块是一种以.py为后缀的文件,在.py文件中定义了一些常量和函数。模块的名称是该.py文件的名称。模块的名称作为一个全局变量__name__的取值可以被其他模块获取或导入。
模块的导入通过ipmort来实现,导入模块的方式如下:
import <moduleName> from <moduleName> import <functionName>
注意:系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。检查方法是在Python交互环境执行import abc,若成功则说明系统存在abc 模块。
包(Package)
包体现了模块的结构化管理思想,包由模块文件构成,将众多具有相关功能的模块文件结构化组合形成包。从编程开发的角度看,两个开发者A和B由可能把各自开发且功能不同的模块文件取了相同的名字。如果第三个开发者通过名称导入模块,则无法确认是哪个模块被导入了。为此,开发者A和B可以构建一个包,将模块放到包文件夹下,通过“包.模块名”来指定模块。
导入示例:
import <packageName.moduleName>
包是一个类似文件夹的东西,它里面包含了很多.py文件还有一个__init__.py文件,__init__.py这个文件是描述有多少个模块的东西。你可以将包理解为完成一系列的功能的一个东西。
根据目前PEP 420的提案,目前的 Python 实际上是有两种包的存在:正规包(regular Package) 以及命名空间包(Namespace package)。
- 正规包:在 Python 3.2 之前就已经存在了,通常是以包含一个py文件的目录形式展现。当 package 被导入时,这个__init__.py 文件会被隐式地执行。
- 命名空间包:根据 PEP 420 的定义,命名空间包是由多个portion组成的 ——portion 类似于父包下的子包,但它们物理位置上不一定相邻,而且它们可能表现为 .zip 中的文件、网络上的文件等等。命名空间包不需要 py 文件,只要它本身或者子包(也就是 portion)被导入时,Python 就会给顶级的部分创建为命名空间包 —— 因此,命名空间包不一定直接对应到文件系统中的对象,它可以是一个虚拟的 module 。
要注意的是,Python 的 package 实际上都是特殊的 module :可以通过导入 package 之后查看globals()可知;实际上,任何带有 __path__ 属性的对象都会被 Python 视作 package 。
库(Library)
Python中的库是借用其他编程语言的概念,没有特别具体的定义,Python库着重强调其功能性。在Python中,具有某些功能的模块和包都可以被称作库。模块有诸多函数组成,包由诸多模块机构化组成,库中也可以包含包、模块和函数。
参考其它编程语言的说法,就是指Python中的完成一定功能的代码集合,供用户使用的代码组合。
库是指具有相关功能模块的集合。这也是Python的一大特色之一,即具有强大的标准库、第三方库以及自定义模块。
- 标准库:Python里那些自带的模块
- 第三方库:就是由其他的第三方机构,发布的具有特定功能的模块。
- 自定义模块:用户自己可以自行编写模块,然后使用。
框架(Framework)
框架是Python库的集合。框架跟库类似,从功能上来说的,框架往往集成了多种库的功能,框架是用来辅助开发某个领域功能的一个包,一般包内还会含有多个子包。框架会方便开发,将某类项目中必须实现的代码直接实现,你只需要去关注你与别项目不同的部分。如爬虫框架scrapy、web开发框架Django和flask、大数据框架pyspark等。