Python基础知识_第11节_模块module
- 模块化(module)程序设计理念
- 模块和包概念的进化史
- 标准库模块(standard library)
- 为什么需要模块化程序
- 模块化编程的流程
- 模块的API和功能描述要点
- `测试代码__name__ == "__main__"`
- 模块文档字符串和API设计
- 模块的导入
- import语句导入
- from...import...导入
- import语句和from...import...
- 命令__import__()动态导入
- 模块的加载问题
- 包(package)的使用
- 包(package)的概念和结构
- pycharm中创建包
- 导入包的操作和本质
- `用*导入包`
- `包内引用`
- sys.path和模块搜索路径
- 模块发布和安装
- 模块的本地发布
- 上传模块到PyPI
- 本地安装模块
模块化(module)程序设计理念
模块和包概念的进化史
- 包(文件夹) – 模块(.py文件)
标准库模块(standard library)
- 标准库模块:Random(随机数)、math(数学运算)、time(时间处理)、file(文件处理)、 os(和操作系统交互)、sys(和解释器交互)
- 第三方模块:科学计算、WEB 开发、大数据、人工智能、图形系统
为什么需要模块化程序
- 便于将一个任务分解成多个模块,团队协作开发大规模程序。
- 可以反复调用。
- 可维护性强。
模块化编程的流程
- 设计 API,进行功能描述。
- 编码实现 API 中描述的功能。
- 在模块中编写测试代码,并消除全局代码。
- 使用私有函数实现不被外部客户端调用的模块函数。
模块的API和功能描述要点
- API(Application Programming Interface 应用程序编程接口)是用于描述模块中函数和类的功能和使用方式。
- 如何查看已有模块的API
- import 模块,control +点变蓝字符串,进入到模块的源码文件,查看顶部comment。
- import 模块,help(模块),查看该模块的API。
- 在python的API文档中查询。金融python安装目录下的docs子目录,双击打开 chm 文档,即可通过索引输入“模块名字”查询到对应的 API 内容。
测试代码__name__ == "__main__"
- 每个模块都有一个名称,通过特殊变量__name__可以获取模块的名称。在正常情况下,模块名字对应源文件名。 仅有一个例外,就是当一个模块被作为程序入口时(主程序、交互式提示符下),它的__name__的值为“_main_”。
- 也就是说其他调用该文件的,不会跑__main__中写的东西,只有在该文件run本文件的code来测试的时候,才会运行__main__中写的东西。
# 【示例】通过__name==“__main__”独立处理模块的测试代码
"""
本模块用于计算公司员工的薪资
"""
company = "北京尚学堂"
def yearSalary(monthSalary):
"""根据传入的月薪,计算出年薪"""
return monthSalary*12
def daySalary(monthSalary):
"""根据传入的月薪,计算出每天的薪资"""
return monthSalary/22.5 # 国家规定每月平均工作日是 22.5
if __name__ =="__main__": #测试代码, 只有在该文件中run才会运行,在其他文件中调用不运行。
print(yearSalary(3000))
print(daySalary(3000))
模块文档字符串和API设计
- 在模块的第一行增加一个文档字符串,用于描述模块的相关功能
然后通过模块名/模块.函数名.__doc__:获得文档字符串内容。
import语句导入
- import语句语法
- import 模块名
- import 模块1, 模块2, …
- import 模块名 as 模块别名
- import加载的模块分为四个类型:
- .py文件
- 共享库/DLL的C/C++扩展
- package
- python的内置模块
from…import…导入
- from 模块名 import *:调用内里函数时,就可以直接引用,无需前面加模块名。
import语句和from…import…
- import 导入的是模块(文件)
- from…import… 导入的是函数/类(文件下的“内容”),调用该函数/类时,前面需要加模块名称(文件)。
命令__import__()动态导入
# 使用__import__()动态导入指定的模块,一般不使用。
s = "math"
m = __import__(s) #导入后生成的模块对象的引用给变量 m
print(m.pi)
# 一般使用importlib模块进行动态导入。
import importlib
a = importlib.import_module("math")
print(a.pi)
模块的加载问题
- 一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。
- 重新加载模块:importlib.reload(模块名)
包(package)的概念和结构
- 包把功能类似的模块放到一起。就是一个带有_init_.py文件的文件夹。
- 包下面可以包含模块(module)和子包(subpackage)。
pycharm中创建包
- 直接在要创建包的地方单击右键:new – python package。会自动生成_init_.py文件。
导入包的操作和本质
- 导入包的语法:
- import 包.子包.模块名:必须加完整名称来引用 ---- 包.子包.模块名.函数名()。
- from 包.子包 import 模块名:直接可以使用模块名 ---- 模块名.函数名()。
- from 包.子包.模块名 import 函数名:直接可以使用函数名 ---- 函数名()。
导入包的本质其实是“导入了包的__init__.py”文件。也就是说,“import pack1”意味着执行了包pack1下面的__init__.py文件。 这样把__init__.py看成普通py文件,然后在该文件中提前批量导入多个我们需要 的模块,而不再需要再调用文件时重复地一个个导入。
- _init_.py文件的核心作用:
- 作为包的标识,不能删除。
- 用来实现模糊导入import*,
- 导入包实质是执行__init__.py 文件,可以在_init_.py文件中做这个包的初始化、以及 需要统一执行代码、批量导入。
用*导入包
- 尽量不要使用
- from 包 import*:import 包中的“所有文件”,但是这个所有文件是在该包中的_init_.py文件,用_all_ = [“module_A1”,“module_A2”]来定义的。
包内引用
- from … import module_A # …表示上级目录
- from . import module_A2 # .表示同级目录
sys.path和模块搜索路径
- Python解释器在导入某个模块文件时,按照如下路径搜索该模块文件。
- 内置模块
- 当前目录
- 程序的主目录
- pythonpath 目录(如果已经设置了 pythonpath 环境变量) 5. 标准链接库目录
- 第三方库目录(site-packages 目录)
- .pth 文件的内容(如果存在的话)
- sys.path.append()临时添加的目录
模块的本地发布
- 创建如下结构的文件,来发布模块baizhanMath2
在文件夹的平级文件中命名一个为『setup.py』的文件,内容如下:
from distutils.core import setup
setup(
name='baizhanMath2', # 对外我们模块的名字
version='1.0', # 版本号
description='这是第一个对外发布的模块,测试哦', #描述
author='gaoqi', # 作者
author_email='gaoqi110@163.com', py_modules=['baizhanMath2.demo1','baizhanMath2.demo2'] # 要发布的模块
)
- 右键要发布的文件,open in terminal。再键入命令:python setup.py sdist。执行完毕后,目录结构变为:
上传模块到PyPI
- 把模块上传到PyPI网站上,成为公开的资源,可以让全球用户资源楼使用。
- 注册PyPI网站:http://pypi.python.org
- 详情见Python基础知识 第十一节模块源码和课件 P20。
本地安装模块
- 仍在 cmd 命令行模式下操作,进 setup.py 所在目录,键入命令:python setup.py install。
- 之后进入 python 目录/Lib/site-packages 目录(第三方模块都安装的这 里,python 解释器执行时也会搜索这个路径)查看是否安装成功。
- 安装成功后,直接用import导入即可。