模块、包、库的关系;一些重要的变量;一些常见的语法。

  模块、包、库的概念

模块 Module

在《Python编程:从入门到实践》_Eric Matthes这本书中说到:A module is a file ending in .py that contains the code you want to import into your program. (模块是以 .py 结尾的文件,它包含您想要导入到程序中的代码。)

模块本质上是一个 Python 程序,以 .py 作为后缀。任何 .py 文件都是模块。

其他可作为模块的文件类型还有 .so、.pyo、.pyc、.dll、.pyd。

通过使用模块,可以有效地避免命名空间的冲突,可以隐藏代码细节,让我们专注于高层逻辑,还可以将一个较大的程序分为多个文件,提升代码的可维护性和可重用性。

包 Package

在大型项目中常常需要编写、用到大量的模块,此时我们可以使用包(Package)来管理这些模块。

Package 是含有一个__init__.py 文件的文件夹。包内可以嵌套包。


__init__.py 的性质

!!!不建议在__init__.py 中写类,以保证该文件的简洁性。

(1)它本身是一个模块。
(2)这个模块的模块名不是__init__,而是这个包的名字,也就是装着__init__.py 文件的文件夹的名字。
(3)它的作用是将一个文件夹(包)变为一个 Python 模块
(4)__init__.py 可以不包含代码,不过此时 import package 是什么也做不了的。所以一般会包含一些 初始化代码,在这个包被 import 的时候,这些代码会自动被执行。


包的性质
(1)实质上是一个文件夹。
(2)该文件夹里面一定有 init.py 模块,其他的模块可以有也可以没有。
(3)一个包里面可以装其他的包。


导入包
导入包的方法和导入模块比较类似,只不过由于层级比一般模块多了一级,所以多了一条导入形式(以下第二种方法)。在导入包的时候,实际上是导入了它的__init__.py 文件。

  1. import 包名[.模块名 [as 别名]]
  2. from 包名 import 模块名 [as 别名]
  3. from 包名.模块名 import 成员名 [as 别名]

使用import <package_name> 批量导入我们需要用到的模块,这样我们就不用在用到的时候再一一导入,方便实用。使用from <package_name> import * 的形式导入一个模块里面的所有内容,则需在__init__.py 中加上all = ['file_a', 'file_b']。其中,package 下有 file_a.py 和 file_b.py。

库 Library

严格来说 Python 中是没有库(library)的,模块(module)和包(package)都是 Python 语法中有的概念,而库只是一个通俗的说法。平时说的库既可以是一个模块也可以是一个包。

我们打开 Python 的安装目录,里面有一个叫做 Lib 的文件夹,文件夹里有很多“标准库”。我们常用的 os 库、random 库、re 库都在里面,这些“库”都是一个个的 python 文件即模块;而json、collections、sqlite3 、tkinter 这些“库”又是一个一个的文件夹(里面都有__init__.py),也就是包。第三方库放在 Lib 文件夹内的 site-pages 文件夹中。

  模块、包、库的关系

层级关系

  • 数据可以封装在容器(元组、列表、集合、字典)里。不管是什么,总的来说,容器给人第一印象就是——“装”。在 Python 中,谁比较能“装”?当然是四大集合类型:Tuple(元组)、List(列表)、Dictionary(字典)、Set(集合)。
  • 代码可以封装在 Function(函数)里。类里的 Function 又叫 Method (方法)。
  • Function 和数据可以封装在 class(类)里。或者说方法和属性可以封装在类里面。
  • 数据、函数、类可以封装在 module(模块)里。
  • 多个 module 可以打包在 package(包)里。
  • 多个 package 可以打包在 library(库)里。

模块的存放位置

Python 程序中使用 import XXX 时,Python 解释器会在如下位置搜索 XXX 模块:
(1)当前目录(执行文件,即主程序所在目录)
(2)Python 程序的 PATH(环境变量)中的每一个目录
(3)Python 安装时默认的模块文件夹(一般是 Lib 文件夹),第三方库在 Lib 文件夹内的 site-pages 文件夹中。

如果都搜索不到导入的模块就会报告异常(Exceptions):

ModuleNotFoundError: No module named '<module_name>'

处理 ModuleNotFoundError

出现 ModuleNotFoundError 异常,说明模块没有放在上述三类路径。由于这三类目录都保存在标准模块 sys 的 sys.path 变量中,因此我们有三种解决方法。
(1)向sys.path变量中临时添加模块文件所在的完整路径

import sys
sys.path.append(r'D:\xxx\yyy')

(2)将模块移动到 sys.path 变量已包含的路径中
(3)添加或修改环境变量中 PATH 变量的值

!!!注意,最好将自己编写的模块放在执行文件所在的目录。

其中,环境变量又分为用户变量(仅对当前用户生效)和系统变量(对系统里所有用户均生效)。Python 在使用 PATH 变量时,会先按照系统 PATH 变量的路径找,然后按照用户 PATH 变量的路径找。通常情况下,设置用户 PATH 变量即可。

模块的说明文档

模块的说明文档也叫文档字符串(docstring)放在该 .py 文件的开头,用成对的三个英文单引号引起来:

'''
Description
'''

我们可以用模块的__doc__属性来访问模块的说明文档:

import demo
print(model.__doc__)

此时运行程序,可以在终端窗口显示出 demo 模块的说明文档。