7.1 模块和包

7.1.1 模块

把功能相近的函数放到一个文件之中。这一个.py文件就称之为一个模块(Module)。例如我们之前编写的代码,都是在一个独立的文件中,这些文件都是模块。

使用模块有什么好处?

最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

7.1.2 包

为了避免模块名冲突,并且对相近的模块进行组织,Python又引入了按目录来组织模块的方法,称为包(Package)。

例如有abc.py和xyz.py两个模块,我们可以通过包来组织模块。方法是选择一个顶层包名,比如mycompany,按照如下目录存放:

mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz

请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany

类似的,可以有多级目录,组成多级层次的包结构。比如如下的目录结构:

mycompany
 ├─ web
 │  ├─ __init__.py
 │  ├─ app.py
 │  └─ www.py
 ├─ __init__.py
 ├─ abc.py
 ├─ app.py
 └─ xyz.py

文件www.py的模块名就是mycompany.web.www,两个文件app.py的模块名分别是mycompany.appmycompany.web.app

自己创建模块或包(即文件名或文件夹)时要注意命名,不能和Python自带的模块名称冲突,并且要遵守基本的标识符命名规范。