Python 模块与包的使用指南
一、模块简介
1.1 什么是模块
-
在 Python 中,一个后缀名为
.py的文件就是一个模块。 -
模块中可以定义函数、类、变量等。
-
模块的作用:
-
避免函数、类、变量等名称冲突。
-
提高代码的可维护性和可重用性。
-
1.2 模块的命名规范
-
模块名应全部使用小写字母,多个单词之间用下划线分隔,例如
my_module。 -
避免使用 Python 的保留字(如
list、str等)作为模块名。 -
模块名应简洁且具有描述性,避免与标准库或第三方库的模块名冲突。
1.3 模块的初始化代码
-
模块文件中可以直接包含可执行代码(如打印语句、函数调用等),这些代码会在模块被导入时自动执行一次。
-
如果不想在导入时执行某些代码,可以将其放在
if __name__ == '__main__':块中,这样只有在直接运行该模块文件时才会执行。
二、自定义模块
2.1 自定义模块的定义
-
自定义模块是一个以
.py结尾的文件。 -
新建 Python 文件,实际上就是在新建模块。
-
自定义模块的作用:
-
规范代码,将功能相同的函数、类等封装到一个模块中,让代码更易于阅读。
-
可以被其他模块调用,提高开发效率。
-
2.2 示例:自定义模块
文件:my_info.py
name = 'kyle'
def introduce():
print(f'My name is {name}')
三、模块的调用
3.1 导入模块的方式
-
import导入方式-
语法:
import 模块名称 [as 别名] -
示例:
import my_info print(my_info.name) # 输出:kyle my_info.introduce() # 输出:My name is kyle
-
-
from ... import导入方式-
语法:
from 模块名称 import 变量/函数/类/* -
示例:
from my_info import name print(name) # 输出:kyle
-
-
使用通配符
*-
语法:
from 模块名称 import * -
注意:如果模块中定义了
__all__列表,那么只有__all__中列出的变量、函数或类会被导入。 -
示例:
from my_info import * print(name) # 输出:kyle introduce() # 输出:My name is kyle
-
3.2 导入多个模块
- 使用英文逗号分隔多个模块名:
import math, time, random
3.3 解决模块冲突
- 如果导入的模块中有同名的变量或函数,后导入的会覆盖先导入的。
# 模块:my_info name = 'kyle' def introduce(): print(f'my name is {name}') # 模块:introduce name = 'rock' age = '20' def introduce(): print(f'my name is {name} and age {age}') # 导入模块 from my_info import * from introduce import * # 导入模块中具有同名的变量和函数,后导入的会将先导入的函数覆盖 print(name) # rock introduce() # my name is rock and age 20 - 解决方法:
- 使用模块名来区分同名变量或函数:
import my_info import introduce print(my_info.name) # 输出:kyle my_info.introduce() # 输出:My name is kyle print(introduce.name) # 输出:rock introduce.introduce() # 输出:My name is rock and age 20 - 使用
as关键字为导入的变量或函数指定别名:from my_info import name as my_info_name from introduce import name as introduce_name print(my_info_name) # 输出:kyle print(introduce_name) # 输出:rock
- 使用模块名来区分同名变量或函数:
四、Python 中的包
4.1 什么是包
-
包是一个包含
__init__.py文件的文件夹(目录)。 -
包的作用:
-
避免模块名称冲突。
-
提供更清晰的模块组织结构。
-
4.2 示例:包的使用
目录结构:
admin/
__init__.py
my_admin.py
文件:admin/__init__.py
print('版权:kyle')
print('Teacher: rock')
文件:admin/my_admin.py
name = 'kyle'
def info():
print('大家好,my name is kyle and age 18')
导入包中的模块:
import admin.my_admin as a
a.info() # 输出:大家好,my name is kyle and age 18
使用 from ... import 导入包中的模块:
from admin import my_admin as b
b.info() # 输出:大家好,my name is kyle and age 18
从包中导入模块中的变量或函数:
from admin.my_admin import name
print(name) # 输出:kyle
使用通配符 * 导入包中的模块:
from admin.my_admin import *
print(name) # 输出:kyle
info() # 输出:大家好,my name is kyle and age 18
4.3 包的嵌套
-
包可以嵌套,例如
admin包中可以包含子包sub_admin。 -
导入子包中的模块可以使用
admin.sub_admin.my_module的形式。
4.4 包的初始化文件 __init__.py
-
包的初始化文件
__init__.py可以用于初始化包,例如定义包级别的变量、函数或类,或者在导入包时自动执行某些代码。 -
示例:
# admin/__init__.py __author__ = 'kyle' __version__ = '1.0'
五、主程序运行
5.1 示例:主程序运行
文件:module_a.py
if __name__ == '__main__':
print('Welcome to Beijing')
name = 'kyle'
print(name)
文件:module_b.py
import module_a
# 导入之后运行,不会输出 module_a 中的 print 语句
5.2 if __name__ == '__main__': 的作用
-
确保某些代码只在直接运行模块文件时执行,而不是在模块被导入时执行。
-
这在开发可复用的模块时非常有用,可以避免模块中的测试代码或主程序代码在导入时被意外执行。
六、模块的搜索路径
6.1 模块的搜索顺序
当导入模块时,Python 会在以下位置查找模块:
-
当前工作目录(即运行脚本所在的目录)。
-
PYTHONPATH环境变量中指定的路径。 -
Python 安装目录中的标准库路径。
-
安装的第三方库路径。
6.2 动态添加模块路径
可以通过以下方法让 Python 找到自定义模块:
- 将模块所在的目录添加到
sys.path中:import sys sys.path.append('/path/to/your/module') import my_module - 或者将模块目录添加到
PYTHONPATH环境变量中。
七、动态导入模块
示例:动态导入模块
import importlib
module_name = 'my_module'
my_module = importlib.import_module(module_name)
my_module.some_function()
八、第三方模块的安装与卸载
# 安装第三方模块的语法:
pip install 模块名
# 卸载第三方模块的语法:
pip uninstall 模块名
# 升级pip命令的语法结构:
python -m pip install -upgrade pip
# 国内下载源
pip install 模块名 -i http://pypi.douban.com/simple --trusted-host pypi.doubancom
九、总结
-
模块:一个
.py文件,用于封装函数、类、变量等,避免名称冲突,提高代码的可维护性和可重用性。 -
包:一个包含
__init__.py文件的目录,用于组织模块,避免模块名称冲突。 -
导入模块:使用
import或from ... import,注意解决模块冲突。 -
主程序运行:使用
if __name__ == '__main__':确保某些代码只在直接运行模块时执行。 -
模块搜索路径:了解模块的搜索顺序,必要时动态添加模块路径。
-
动态导入:使用
importlib动态导入模块。

浙公网安备 33010602011771号