第七章 模块module
模块化程序设计理念
模块和包概念的
- 语句—函数和变量—类和对象—模块—包
- python程序由模块组成,一个模块对应一个python文件,一般后缀名为.py
- 语句是python程序的构造单元,用于创建对象、变量赋值】调用函数、控制语句
标准库模块standard library
- 函数库分为标准库和用户自定库,第三方库也是用户自定义库
- 标准库提供了操作系统功能、网络通信、文本处理、文件处理、数学运算等基本功呢个,比如random随机数、math数学运算、time时间处理、file文件处理、os操作系统交互、sys解释器交互
- 第三方模块功能覆盖:科学计算、WEB开发、大数据、人工智能、图形系统
模块化编程
- 模块化编程module programming的优点:
-将一个任务分解成多个模块,实现团队协同开发,实现大规模程序;
-实现代码复用
-可维护性增强 - 模块化编程的一般流程:
-设计API,进行功能描述;
-编程实现API中描述的功能;
-在模块中编写测试代码,并消除全局变量;
-使用私有函数实现不被外部客户端调用的模块函数;
模块的API和功能描述要点
- API(application programming interface,应用程序编码接口)用于描述模块中提供的函数和类的功能描述和使用方式描述
- 模块化编程中,首先设计的是模块的API(即实现的功能描述),然后开始编码实现API中描述的功能,最后在其他模块中导入该模块的进行调用
- 可通过help(模块名)查看模块的API,一般先导入模块,然后再使用help()查看。
- 可通过__doc__获得模块的文档字符串的内容
模块的创建和测试代码
- name:获取模块的名字,正常情况下,模块的名字对应源文件名,除当一个模块被作为程序入口时(主程序、交互式提示符下)的情况下,name__的值为__main。因此根据这个特点,将模块源代码文件中的测试代码进行独立处理
模块文档字符串和API设计
- 模块的第一行增加一个文档字符串,用于描述模块的相关功能,然后通过__doc__获得文档字符串的内容
模块的导入
import语句导入
- import语句的基本语法:
import 模块名 #导入一个模块
import 模块1,模块2 #导入多个模块
import 模块名 as 模块别名 #导入模块并使用新名字 - import加载的模块氛围四个通用类别:
使用python编写的代码(.py文件)
已被编译为共享库或DDL的C或C++扩展
包好的一组模块的包
使用C编写并连接到python解释器的内置模块 - 通过import导入模块,实际是使用了内置函数__import__()。通过import导入一个模块时,python解释器会执行,最终会生成一个对象,这个对象代表了被加载的模块。
from…import导入
- from…import导入模块中成员,基本语法:
from 模块名 import 成员1,成员2 - 若希望导入一个模块中的所有成员,可以采用:
from 模块名 import * - 避免使用from 模块名 import *。其中表示导入模块中所有的不是以下划线_开头的名字都导入当前位置,因此可能覆盖掉已经定义的名字,可读性较差
from…import 和import的区别
- import导入的是模块,from…import 导入的是模块中的一个函数\类
- import导入的是文件,若使用文件下的内容,必须在前面加文件名称。from…import导入文件下的内容,可以直接使用内容,不需要添加文件名称
import()动态导入
- import语句本质是调用内置函数__import__(),可以通过它实现动态导入,给__import__()动态传递不同的参数值,就能导入 不同的模块。
- 不建议使用 import()动态导入,如果需要动态导入可以使用importlib模版
a="math"
m=__import__(a)
print(m.pi)
import importlib
a=importlib.import_module("math")
print(a.pi)
模块的加载问题
- 当导入一个模块时,模块中的代码都会被执行;如果再次导入这个模版,则不会再次执行。因为导入模块更多时候需要定义模块中的变量、函数、对象等,这些并不需要反复执行。只导入一次import-only-once成为一种执行
- !!模块无论导入多少次,这个模版在整个解释器进程内有且仅有一个实例对象
- 可以通过import importlib importlib.import.reload()重新导入模版
包package的使用
包的概念和结构
- 当一个项目存在很多模版,需要进行组织。我们将功能类似的模版放在一起,形成包。本质上,包必须有一个__init__.py的文件夹。包可以包含模版以及子包subpackage
导入包操作和本质
1)import a.aa.moudle_AA:在使用时必须加完整名称来引用,比如import a.aa.moudle_AA.fun_AA()
2)from a.aa import moudle_AA:在使用时可以直接使用模块名,如moudle_AA.fun_AA()
3)from a.aa.moudle_AA import fun_AA():可直接使用函数名
from package import item:item可以是包、模块、函数等
import item1.item2:item必须是包或模块
- 每个包下面有__init__.py文件,三个核心作用主要是:
1)作为包的标识,不能删除
2)用来实现模糊导入
3)导入包实质上是执行__init__.py文件,可在__init__.py文件中做包的初始化以及需要统一执行代码。 - 可以在__init__.py中批量导入我们需要的模版,不需要一个个导入
用*导入包
- import *理论时上希望文件系统找出包内所有子模块,然后导入,python为解决该问题提供的方案是提供一个包索引。
- 索引是由__init__.py定义__all__变量,该变量为一列表,如__all__=[“module_A”,“module_B”]
包内引用
- 如果是子包的引用,可以按相对位置引入子模版
from . import module_A # . 表示同级目录
from … import module_A # … 表示上级目录
sys.path和模块搜索路径
- python解释器一般按照以下的路径寻找模块文件(按照顺序寻找,找到即停不继续往下寻找):
内置模块、
当前目录、
程序的主目录、
pythonpath目录、
标准链接库目录、
第三方库目录、
.pth文件的内容<可在site-packages目录下添加.pth文件,一行一个目录>
sys.path.append()临时添加的目录
模块发布和安装
模块的本地发布
1)为模块文件创建如下结构的文件(文件夹与模块名一致)
2)在文件夹中创建一个名为【setup.py】的文件,内容如下:
from distutils.core import setup
setup(
name="aaaa" #对外我们模块的名字
version="1.0" #版本号
description="abcd" #描述
author=“a” #作者
author_mail=“”
py_modules=["module1","module2"] #要发布的模版
)
3)构造一个发布文件,通过终端,cd到模版文件下面,再键入命令python setup.py sdist
本地安装
- 将发布安装到您的本地计算机上,仍在cmd命令行模式下操作,进setup.py所在的目录键入命令:python setup.py installl
- 安装成功后,进入python目录/Lib/site-packages目录(第三方模块都安装在这里,python解释器执行时也会搜索这个路径)。安装成功后,直接使用import导入即可。
上传模块到PyPI
- 注册PyPI网站