一、模块与包
- python中的模块包括系统模块、第三方模块和用户自定义的模块。他们实质上是以 .py为扩展名的python文件。
- 通过导入模块,可以使用该模块中的变量函数和类等。
二、模块化程序设计的概念
- 如果程序中包含多个可以复用的函数或类,则通常把相关的函数和类分组包含在单独的模块(module)中。这些提供计算功能的模块称之为模块(或函数模块),导入并使用这些模块的程序,则称之为客户端程序。
- 把计算任务分离成不同模块的程序设计方法,称之为模块化编程
(modular programming)。使用模块,可以将计算任务分解为大小合理的子任务,并实现代码的重用功能。
1、模块的API
- 模块和客户端之间遵循的契约为API
- API用于描述模块中提供的函数的功能和调用方法
- 模块化程序设计的基本原则是先设计API(即模块提供的函数或类的功能描述),然后实现API(即编写程序,实现模块函数或类),最后在客户端中导入并使用这些函数或类
- API通常由两部分组成:可用函数的签名的精确规范,以及描述函数作
用的非正式自然语言描述。API一般使用表格的形式,描述模块中的变
量、函数和类
函数调用 | 功能描述 |
---|---|
add(x,y) | 加法函数add(x,y) |
sub(a,b) | 减法函数sub(a,b) |
mul(x,y) | 乘法函数mul(x,y) |
div(x,y) | 除法函数div(x,y) |
2、模块设计的一般原则
- (1)先设计API,再实现模块
- (2)控制模块的规模,只为客户端提供需要的函数。实现包含大量函数的模块会导致模块的复杂性。例如,Python的math模块中就不包含正割函数、余割函数和余切函数,因为这些函数很容易通过函数math.sin()、math.cos()和math.tan()的计算而得。
- (3)在模块中编写测试代码,并消除全局代码
- (4)使用私有函数实现不被外部客户端调用的模块函数
- (5)通过文档提供模块帮助信息
3、模块的实现的概念
- “实现”是指实现用于重用的函数或类的代码,模块的实现就是若干实现函数或类的代码的集合,保存在一个后缀为.py的文件中;
- 模块的实现必须遵循API规约,可以采用不同算法实现API,这为模块的改进和版本升级提供了无缝对接,只需要使用遵循API的新的实现,所有客户端程序无须修改即可以正常运行。
4、模块的客户端
- 客户端遵循API提供的调用接口,导入和调用模块中实现的函数功能;
- API允许任何客户端直接使用模块,而无需检测模块中定义的代码,例如可以直接使用模块math和random等。
5、模块化设计的优越性
- 可以编写大规模的系统程序
- 控制程序的复杂度
- 实现代码重用
- 增强可维护性
三、模块的导入与创建
1、导入(import)
- import模块名
import random
random.randint(1,10)
10
- from模块名import函数名或:from模块名import*
from random import randint
randint(1,10)
5
2、创建模块
- Python模块对应于包含Python代码的源文件(其扩展名为.py),在文件中可以定义变量、函数和类;
- 在模块中,除了可以定义变量、函数和类之外,还可以包含一般的语句,称之为主块(全局语句)。当运行该模块,或导入该模块时,主块语句将依次执行。
Python文件中的每个文件都可以做为一个模块存在,文件名即模块名
import os
os.getcwd() # 查看当前路径
os.chdir('D:\\module') # 修改当前路径
import sys
sys.path #查看搜索路径
四、模块的属性
“__all__” 与 "__name__"属性
- __all__ = [] # __all__ 变量控制模块哪些功能可以使用*号导入
__all__ = ['fac_1'] # fac_1为模块里的功能
- Python中的模块(.py文件)在创建之初会自动加载一些内建变量,__name__就是其中之一。
- 每个模块都有一个名称,通过特殊变量__name__可以获取模块
的名称 - 特别地,当一个模块被用户单独运行时,其__name__的值为’main’。故可以把模块源代码文件的测试代码写在相应的测试判断中,以保证只有单独运行时,才会运行测试代码