Python模块化编程
目录
module程序设计理念
- Python 程序由模块组成,一个模块对应python 源文件,一般后缀名是:.py;
- 模块由语句组成,运行Python 程序时,按照模块中语句的顺序依次执行;
- 语句是Python 程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等
模块化编程有如下几个重要优势: - 便于将一个任务分解成多个模块,实现团队协同开发,完成大规模程序
- 实现代码复用
- 可维护性增强
模块化编程流程
模块化编程的一般流程:
- 设计API,进行功能描述;
- 编码实现API 中描述的功能;
- 在模块中编写测试代码,并消除全局代码;
- 使用私有函数实现不被外部客户端调用的模块函数
API和功能描述
可以通过**help(模块名)**查看模块的API,一般使用时先导入模块然后通过help函数查看
import math
help(math)
对于自定义的模块,可以通过**__doc__**可以获得模块的文档字符串的内容
"""
本模块用于计算
"""
def computation(a):
"""computation"""
pass
import compute
print(compute.__doc__)
print(compute.computation.__doc__)
模块的创建和测试代码
每个模块都有一个名称,通过特殊变量__name__可以获取模块的名称。在正常情况下,模块名字对应源文件名
仅有一个例外,就是当一个模块被作为程序入口时(主程序、交互式提示符下),它的__name__的值为__main__
# 通过__name==“__main__”独立处理模块的测试代码
"""
本模块用于计算公司员工的薪资
"""
company = "company1"
def yearSalary(monthSalary):
"""根据传入的月薪,计算出年薪"""
return monthSalary*12
def daySalary(monthSalary):
"""根据传入的月薪,计算出每天的薪资"""
return monthSalary/22.5 #国家规定每个月的平均工作日是22.5
if __name__ =="__main__": #测试代码
print(yearSalary(3000))
print(daySalary(3000))
模块的导入
import导入
import 语句的基本语法格式如下:
import 模块名#导入一个模块
import 模块1,模块2… #导入多个模块
import 模块名as 模块别名#导入模块并使用新名字
import 加载的模块分为四个通用类别:
- 使用python 编写的代码(.py 文件);
- 已被编译为共享库或DLL 的C 或C++扩展;
- 包好一组模块的包;
- 使用C 编写并链接到python 解释器的内置模块;
import 本质上是使用了内置函数__import__()
当我们通过import 导入一个模块时,python 解释器进行执行,最终会生成一个对象,这个module类的对象就代表了被加载的模块
from … import 导入
import 导入的是模块,from…import 导入的是模块中的一个函数/一个类
如果进行类比的话,import 导入的是“文件”,必须前面加“文件名称”;from…import 导入的是文件下的“内容”,前面不需要加“文件名称”
__import__()动态导入
import 语句本质上就是调用内置函数__import__(),可以通过它实现动态导入,给__import__()动态传递不同的的参数值,就能导入不同的模块
s = "math"
m = __import__(s) #导入后生成的模块对象的引用给变量m
print(m.pi)
一般不建议使用__import__()导入,其行为在python2 和python3 中
有差异,会导致意外错误,如果需要动态导入可以使用importlib模块
import importlib
a = importlib.import_module("math")
print(a.pi)
模块的加载
当导入一个模块时, 模块中的代码都会被执行,如果再次导入这个模块,则不会再次执行
一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象
有时候我们确实需要重新加载一个模块,这时候可以使用**importlib.reload()**方法
包package
包的概念和结构
将功能类似的模块放到一起,形成了“包”
本质上,“包”就是一个必须有__init__.py 的文件夹
包下面可以包含模块(module),也可以再包含子包(subpackage)
导入包
导入包的本质其实是“导入了包的__init__.py”文件,在__init__.py 中批量需要的模块
- import a.aa.module_AA
使用时,加完整名称来引用,比如:a.aa.module_AA.fun_AA() - from a.aa import module_AA
使用时,可以直接使用模块名,比如:module_AA.fun_AA() - from a.aa.module_AA import fun_AA 直接导入函数
使用时,可以直接使用函数名,比如:fun_AA()
如果是子包内的引用,可以按相对位置引入子模块
- from … import module_A #…表示上级目录.表示同级目录
- from . import module_A2 #.表示同级目录
sys.path 和模块搜索路径
模块发布和安装
本地发布和安装
发布
- 创建模块文件夹
- 在文件夹同一级目录下创建setup.py文件
- 在终端内进入对应文件夹,执行python setup.py sdist,生成dist文件夹
安装
- 在终端内进入对应文件夹,执行python setup.py install
- 安装成功后,我们进入python 目录/Lib/site-packages 目录(第三方模块都安装的这里,python 解释器执行时也会搜索这个路径),可以看到对应名称的文件夹
- import导入使用
上传到PyPI(略)
库 Library
标准库模块 standard library
用户自定义模块(包含第三方模块)
PyPI(Python Package Index)是python 官方的第三方库的仓库,所有人都可以下载第三方库或上传自己开发的库到PyPI
PyPI 推荐使用pip 包管理器来下载第三方库,pip 是一个现代的,通用的Python 包管理工具,提供了对Python 包的查找、下载、安装、卸载的功能
安装方式:
- pip install
- IDE中直接安装