18. 模块
一、什么是模块
模块化 指将一个完成的程序分解为一个一个小的模块。通过将模块组合,来搭建一个完整的程序。如果不采用模块化,那么所有的代码将统一保存到一个文件中。采用模块化后,将程序分别编写到多个文件中。使用模块化后,我们可以把代码进行复用,这方面后序的开发和维护。
二、模块的创建
在 Python 中一个 .py 结尾的文件就是一个模块。要向创建一个模块,就需要创建一个 Python 文件。模块名要符合标识符的命名规范。
创建一个 moudle.py 文件,内容如下:
if __name__ == "__main__":
print('当前模块被作为主模块执行了')
print(__name__,"模块模块被执行了")
# 在模块中定义的变量,在引入模块后,就可以直接使用了
a = 10
# 可以在模块中定义函数
def test():
print("我是", __name__ , "模块中的test()方法")
# 可以定义类
class Person:
def __init__(self):
self.name = "Sakura"
当当前文件被运行时,
__name__
等于__main__
,如果当前模块是被导入的话,则__name__
等于模块的名称;
三、模块的引入
3.1、使用import导入模块
我们可以通过 import 关键字引入多个模块,多个模块之间用逗号(,)分隔。import 语句可以在程序的任意位置调用,但是一般情况下,import 语句都会统一写在程序的开头。我们可以引入同一个模块多次,但是模块的实例只会创建一个。每一个模块内部都有一个 __name__
属性,通过这个属性可以获取模块的名字。
import 模块名1,模块名2,...
其中,模块名就是 Python 文件的名字,不要后缀名(.py)。在使用 import 语句导入不同模块时,每执行一条 import 语句都会创建一个新的名称空间(namespace),并且在该名称空间中执行与 .py 相关的所有语句。在调用模块中的变量、函数和类名前加上 “模块名.”的前缀。
使用 import 语句首次导入模块时,会产生该模块对应的名称空间。然后会运行该模块,将该模块运行过程中生成的名字都会丢到这个名称空间中。然后会在当前执行文件中产生一个名字,该名字指向被导入模块产生的名称空间。之后的导入,都是直接引用首次导入产生的名称空间,不会重复实现。
创建 template.py 文件,内容如下:
import moudle
# 一个程序中只会有一个主模块,主模块就是直接通过 Python 执行的模块。
print("主模块",__name__)
print(moudle)
print(moudle.__name__)
# 访问模块中的属性
print(moudle.a)
# 访问模块中的方法
moudle.test()
# 使用模块中的类
p = moudle.Person()
print(p)
print(p.name)
我们还可以通过 as 关键字为模块名指定别名。
import 模块名 as 别名
import moudle as test
print(test)
print(test.__name__)
命名空间可以理解为记录名字和对象之间对应关系的空间;
目前 Python 的命名空间大部分都是通过字典(dict)来实现的,其中,key 是标识符,value 是具体的对象;
3.2、使用from...import导入模块
如果每次导入模块时都创建一个新的命名空间,而是将具体的定义导入到当前的命名空间中,这时可以使用 from...import 语句。使用 from...import 语句后,不需要再添加前缀,可以直接通过具体的变量、函数、类名等访问。
from 模块名 import 变量
使用 from ... import 导入模块时,会产生该模块对应的名称空间。然后会运行该模块,将该模块运行过程中生成的名字都会丢到这个名称空间中。然后会在当前文件的名称空间拿到一个名字,该名字指向被导入模块中的对应成员的内存地址。
创建 routine.py 文件,内容如下:
from moudle import Person,test
p = Person()
print(p)
print(p.name)
test()
我们还可以通过如下方法引入模块中的所有内容:
from 模块名 import *
在通过 from 模块名 import * 导入模块中的内容时,不会引入以下划线开头的变量。
我们还可以为引入的变量使用别名:
from 模块名 import 变量 as 别名
from moudle import test as new_test
def test():
print("我是主模块中的test()方法")
test()
new_test()
在使用 from...import 导入模块中的定义时,需要保证所导入的内容在当前的命名空间是唯一的,否则将会出现冲突,后导入的同名变量、函数或者类会覆盖先导入的;
3.3、模块的导入规则
在 Python 内部导入模块时,必须要遵循它的导入规则,必须去指定的目录中去找 .py 文件。我们可以通过 sys 模块中的 path 属性来查看指定的导入目录。
import sys
for item in sys.path:
print(item)
运行结果如下:
e:\Source\Software\Python # 当前文件所在的目录
D:\Pycharm\Python311\python311.zip # Python解释器的python311.zip压缩包
D:\Pycharm\Python311\DLLs # Python解释器的DLLs目录
D:\Pycharm\Python311\Lib # Python解释器的Lib目录
D:\Pycharm\Python311 # Python解释器的根目录
D:\Pycharm\Python311\Lib\site-packages # Python解释器的Lib目录下的site-packages目录,第三方模块的安装目录
在 Pycharm 中运行此代码时,会自动添加当前项目的目录到 sys.path 中;
导入文件时,都是根据 sys.path 中的目录进行 .py 文件的寻找。在导入模块前,我们可以通过 append() 方法自己添加路径。
import os
import sys
path = os.path.abspath(__file__) # 获取当前运行文件的绝对路径
parent_path = os.path.dirname(path) # 获取当前运行文件所在的目录
base_path = os.path.dirname(parent_path) # 获取当前运行文件所在的目录的上一级目录
sys.path.append(parent_path)
sys.path.append(base_path)
for item in sys.path:
print(item)
四、标准库
为了实现开箱即用的思想,Python 为我们提供了一个模块的标准库。在这个标准库中,有很多很强大的模块我们可以直接使用,并且这个标准库会随 Python 的安装一同安装。
对于标准库中的模块,我们可以直接使用 import 语句导入到 Python 文件中使用。
import 模块名
Python 中提供了许多标准模块,我们可以在 Python 的帮助文档中查看。具体的方法是:打开 Python 的安装目录下的 Doc 下的 html 目录,在该目录中有一个名为 index.html 文件即为 Python 的帮助文档。
模块名 | 描述 |
---|---|
sys | 与 Python 解释器一起环境相关的标准库 |
time | 提供与时间相关的各种函数的标准库 |
os | 提供了访问操作系统服务功能的标准库 |
calendar | 提供了与日期相关的各种函数的标准库 |
urllib | 用来读取来自网上(服务器上)数据据的标准库 |
json | 用于使用 JSON 序列化和反序列化对象 |
re | 用于在字符串中执行正则表达式匹配和替换 |
math | 提供算术运算函数的标准库 |
decimal | 用于进行精确控制运算精度、有效数位和四舍五入操作的十进制运算 |
shutil | 用于进行高级文件操作,如复制、移动、重命名等 |
logging | 提供了灵活的记录事件、错误、警告和调试信息等日志信息的功能 |
tkinter | 使用 Python 进行 GUI 编程的标准库 |
import sys
# pprint模块中的pprint()方法可以用来堆打印的数据做简单的格式化
import pprint
# 获取执行代码时,命令行中所包含的参数
# 该属性是一个列表,列表中保存了当前命令的所有参数
# 命令行中输入 python python文件名 参数1 参数2 ...
print(sys.argv)
# 获取当前程序中加载的所有模块
# moudules是一个字典,字典的key是模块的名字,字典的value是模块对象
pprint.pprint(sys.modules)
# 它是一个列表,列表中保存的是模块的搜索路劲
pprint.pprint(sys.path)
# 表示当前python运行的平台
print(sys.platform)
# 该函数用来退出程序
sys.exit("程序运行结束")
import os
# 通过这个属性可以获取系统的环境变量
print(os.environ,'\n')
print(os.environ["path"],'\n')
# 可以用来执行操作系统的命令
os.system("dir")
五、第三方库
在进行 Python 程序开发时,除了可以使用 Python 内置的标准模块外,还可以使用第三方模块。对于这些第三方模块,可以在 Python 官方推出的 http://pypi.python.org/pypi 中找到。在使用第三方模块时,需要先下载并安装该模块,然后就可以像使用标准模块一样导入并使用了。下载和安装第三方模块可以使用 Python 提供的 pip 命令实现。pip 的语法格式如下:
pip <command> [moudulename]
- command:用于指定要执行的命令。常用的参数值有 install(用于安装第三方模块)、uninstall(用于卸载已经安装的第三方模块)、list(用于显示已经安装的第三方模块)等;
- moudulename:可选参数,用于指定要安装或卸载的模块名,当 command 为 install 和 uninstall 时不能省略。
pip 指明在命令行(cmd)中使用;
第三方库安装在 Python 解释器的下的 Lib 目录下的 site-packages 的目录;