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 开发、大数据、人工智能、图形系统

为什么需要模块化程序

  • 便于将一个任务分解成多个模块,团队协作开发大规模程序。
  • 可以反复调用。
  • 可维护性强。

模块化编程的流程

  1. 设计 API,进行功能描述。
  2. 编码实现 API 中描述的功能。
  3. 在模块中编写测试代码,并消除全局代码。
  4. 使用私有函数实现不被外部客户端调用的模块函数。

模块的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)的使用

包(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解释器在导入某个模块文件时,按照如下路径搜索该模块文件。
    1. 内置模块
    2. 当前目录
    3. 程序的主目录
    4. pythonpath 目录(如果已经设置了 pythonpath 环境变量) 5. 标准链接库目录
    5. 第三方库目录(site-packages 目录)
    6. .pth 文件的内容(如果存在的话)
    7. sys.path.append()临时添加的目录
模块发布和安装

模块的本地发布

  • 创建如下结构的文件,来发布模块baizhanMath2
  • python module init python module initial_字符串

  • 在文件夹的平级文件中命名一个为『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。执行完毕后,目录结构变为:
  • python module init python module initial_API_02


上传模块到PyPI

  • 把模块上传到PyPI网站上,成为公开的资源,可以让全球用户资源楼使用。
  • 注册PyPI网站:http://pypi.python.org
  • 详情见Python基础知识 第十一节模块源码和课件 P20。

本地安装模块

  • 仍在 cmd 命令行模式下操作,进 setup.py 所在目录,键入命令:python setup.py install。
  • 之后进入 python 目录/Lib/site-packages 目录(第三方模块都安装的这 里,python 解释器执行时也会搜索这个路径)查看是否安装成功。
  • 安装成功后,直接用import导入即可。