python模块与包
在开始模块与包之前,先看一下他们的定义:
- 模块:模块对应于Python源代码文件
➢python中的模块包括系统模块、第三方模块和用户自定义模块。他们实质上是 以.py为扩展名的文件
➢通过导入模块,可以使用该模块中的变量、函数和类等 - 包:多个功能相似的模块可以组织成一个包
1、模块化程序设计的思想
-
模块化程序设计的概念
-
如果程序中包含多个可以重复使用的函数或类,则可以把相关的函数和类分
组包含在单独的模块(module)中。这些提供计算功能的模块称之为模
块(或函数模块),导入并使用这些模块的程序,则称之为客户端程序。 -
把计算任务分离成不同模块的程序设计方法,称之为模块化编程
(modular programming)。使用模块,可以将计算任务分解为大小合理
的子任务,并实现代码的重用功能 -
模块的API
-
模块和客户端之间遵循的契约称为API
-
API用于描述模块中提供的函数的功能和调用方法。
-
模块化程序设计的基本原则是先设计API(即模块提供的函数或类的功能
描述),然后实现API(即编写程序,实现模块函数或类),最后在客户
端中导入并使用这些函数或类 -
通过内置函数help(),可以查看模块的API,还可以通过python在线帮助查看math模块的API
>>>import math
>>>help(math)
-
模块设计的一般原则
-
(1)先设计API,再实现模块
-
(2)控制模块的规模,只为客户端提供需要的函数。实现包含大量函数的模
块会导致模块的复杂性。例如,Python的math模块中就不包含正割函数、余
割函数和余切函数,因为这些函数很容易通过函数math.sin()、math.cos()和
math.tan()的计算而得 -
(3)在模块中编写测试代码,并消除全局代码
-
(4)使用私有函数实现不被外部客户端调用的模块函数
-
(5)通过文档提供模块帮助信息
-
模块实现的概念
-
模块的实现就是若
干实现函数或类的代码的集合,保存在一个后缀为.py的文件中; -
模块的实现必须遵循API规约,可以采用不同算法实现API,
-
模块化程序设计的优越性
-
可以编写大规模的系统程序
-
控制程序的复杂度
-
实现代码重用
-
增强可维护性
2、模块的导入与创建
- 模块导入方式
模块导入方式有两种: - import 模块名
- from 模块名 import 函数名 或
from 模块名 import *
>>>import math
from math import exp
from math import *
- 模块导入
使用import方式导入时: - 使用import方式导入模块时,模块中的所有内容都会被导入到当前程序中
- 使用import还可一次导入多个模块,每个模块名之间使用“,”分割。在命令行中导入某个模块,用户可调用指定模块中的任意方法
>>>import 模块1,模块2,....
>>>模块.方法()
使用from 模块名 import 方法/类/对象
使用import语句导入模块,在每次调用方法时,都需要添加前缀“模块名.”若是有些方法使用频率高,或者模块名较长等,操作起来就比较复杂。但是“from…import…”语句,
就不用在方法前面加前缀“模块.”,其用法:
>>>from random import randint
>>>randint(1,10)
from…import…语句也可一次导入多个方法(或类、对象),多个方法之间用“,”隔开
>>>from random import randint,random,choice
>>>random(1,10)
6
>>>random()
0.5187665930841437
**使用from…import ***
其通配符“*”指代模块中的全部方法,以random模块为例,
>>>from random import *
>>>randint(1,10)
2
>>>random()
0.8772480412046829
- 创建模块
- Python模块对应于包含Python代码的源文件(其扩展
名为.py - 在模块中,除了可以定义变量、函数和类之外,还可
以包含一般的语句,称之为主块(全局语句)。当运
行该模块,或导入该模块时,主块语句将依次执行
➢ Python文件中的每个文件都可以做为一个模块存在,文
件名即模块名
对于自定义的模块,在没有放到python中之前,调用模块需要把模块的路径添加到搜索路径之后才能调用,操作如下:
>>>import os
>>>os.getcwd() #查看当前路径
>>>os.chdir('C:\\Users\\z9761\\Desktop\\my_modules')
##更改路径时是双斜杠
>>>import sys
>>>sys.path #查看搜索路径
>>>import my_modules
>>>help(my_modules)
>>>my_modules.special_add(3,5)
>>>my_modules.pipi
3、模块的搜索路径
模块搜索路径即python搜索模块时的路径,这些路径存储于sys模块中的sys.path属性中
sys.path的本质是列表,因此用户可通过列表的内置方法append向sys.path中添加模块所在路径,其方法如下:
注意:添加的路径第一个一定是双斜杠,其它是单斜杠
4、模块的属性
“_all”与"name"
- __all__属性
all = [],列表为空,则模块中没有功能可以使用号导入,列表里面包含哪些功能,哪些功能就可以使用号导入
>>>from my_module import *
>>>special_add(3,5)
108
__name__属性:
-
模块测试代码
-
每个模块都有一个名称,通过特殊变量__name__可以获取模块
的名称 -
特别地,当一个模块被用户单独运行时,其__name__的值为
‘main’。故可以把模块源代码文件的测试代码写在相应的测
试判断中,以保证只有单独运行时,才会运行测试代码 -
模块的导入特性
模块在被导入时,会被执行一次,这个过程也叫做加载。一个模块即便被多次导入程序,也会只会被加载一次。 -
模块的缓存
按字节编译的.pyc文件 -
.pyc文件是经过编译后的字节码,这样下次导入时,如果模
块源代码.py文件没有修改(通过比较两者的时间戳),则直
接导入.pyc文件,从而提高程序效率; -
按字节编译的.pyc文件是在导入模块时,python解释器自动
完成,无需程序员手动编译
包及模块的打包发布
➢包是Python引入的分层次的文件目录结构,它定义了一个由
模块及子包,和子包下的子包等组成的 Python 的应用环境。
引入了包以后,只要顶层的包名不与别人冲突,那所有模块
都不会与别人冲突。
➢每一个Python的包目录下面都会有名为__init__.py的特殊文件,
该文件可以为空文件,但是必须存在,它表明这个目录不是
普通的目录结构,而是一个包,里面包含模块。
➢用户可通过编辑子包中的__init__.py文件,再以“from 包.子包 import *”的方式导入子包的指定内容
- 模块的打包发布
- 将待发布的包放在与setup.py文件同级的目录中,目录结构如下所示:
其中setup函数包含5个参数,依次为:包名、版本号、描述信息、作者以及包中含有的模块,setup不只这些函数,可以自行选择
在当前的路径下打开命令行窗口,使用build命令构建模块:
python setup.py build