一、什么是模块?有什么用?
模块(module):一个.py文件就是一个模块,模块是 Python 程序的基本组织单位。在模块中可以定义变量、函数、类,以及可执行的代码。
作用:
提高代码复用性
降低开发门槛
避免命名冲突
原课件核心表述:
模块:就是一个 python 文件 (.py),其中就包含了变量、函数、类,以及可执行的代码。
作用:提高代码复用性,降低开发门槛
二、导入模块的常用语法
在使用模块中提供的功能之前,必须得先导入,再使用。导入模块的具体语法如下(导入语句一般写在.py文件的开头):
导入形式 | 代码样例 | 调用方式 | 调用方式 |
import模块名 | import random, os | 模块名.功能名 | random.randint(10, 100) |
import模块名as别名 | import random as rd | 别名.功能名 | rd.randint(10, 100) |
from模块名import功能名 | from random import randint,choice | 功能名 | randint(10, 100) |
from模块名import功能名as别名 | from random import randint as rint | 别名 | rint(10, 100) |
from模块名import * | from random import * | 功能名 | randint(10, 100) |
2.1 基础导入示例
假设我们有一个自定义模块circle_fun.py,其中定义与圆相关的常量和函数:
# circle_fun.py PI = 3.14159 def circle_area(radius): """计算圆的面积""" return PI * radius * radius def circle_perimeter(radius): """计算圆的周长""" return 2 * PI * radius在main.py中,我们可以使用不同的导入方式调用这些功能:
# main.py - 方式1:import 模块名 import circle_fun print(circle_fun.PI) # 3.14159 print(circle_fun.circle_area(5)) # 78.53975# main.py - 方式2:from 模块名 import 功能名 from circle_fun import PI, circle_area print(PI) # 3.14159 print(circle_area(5)) # 78.53975# main.py - 方式3:from 模块名 import *(谨慎使用) from circle_fun import * print(PI) # 3.14159 print(circle_perimeter(5)) # 31.4159三、自定义模块
当开发一些复杂的项目,为了让项目结构更清晰,更便于项目的维护管理及代码的复用,可能会把一个项目拆分为若干个模块。
3.1 模块级特殊变量:__all__与__name__
3.1.1__all__
__all__是一个模块级别的特殊变量,用于指定from 模块名 import *时会导入哪些功能(*通配了哪些功能)。
示例:在circle_fun.py中限制import *只导入circle_area和PI,而不导入circle_perimeter。
# circle_fun.py(带 __all__) __all__ = ['PI', 'circle_area'] # 仅这两个会通过 import * 被导入 PI = 3.14159 def circle_area(radius): return PI * radius * radius def circle_perimeter(radius): return 2 * PI * radius然后在main.py中:
from circle_fun import * print(PI) # 正常 print(circle_area(5)) # 正常 # print(circle_perimeter(5)) # 报错:NameError,因为未导入3.1.2__name__
__name__是 Python 中非常重要的内置变量,表示的是当前模块的名称:
当模块直接运行时:
__name__的值为"__main__"当模块被导入时:
__name__等于模块的文件名(不含.py后缀)
典型用法:在模块中添加测试代码,仅在直接运行时执行。
# circle_fun.py PI = 3.14159 def circle_area(radius): return PI * radius * radius def circle_perimeter(radius): return 2 * PI * radius # 测试代码,仅当直接运行此模块时执行 if __name__ == "__main__": print("测试:半径5的圆面积 =", circle_area(5)) print("测试:半径5的圆周长 =", circle_perimeter(5))当你直接运行python circle_fun.py时,测试代码会执行;当其他模块导入它时,测试代码不会运行,保证了模块的纯净性。
四、软件包(Package)
包:本质就是一个文件夹,该文件夹中可以包含若干 Python 模块(.py文件),文件夹下还包含了一个__init__.py。
作用:模块文件较多时,用来管理多个模块。(包的本质也是一个模块)
4.1 包的结构示例
utils/ # 包名 __init__.py # 标识这是一个包 math_utils.py # 数学相关模块 string_utils.py # 字符串相关模块 __all__ = ["my_fun", "my_var"] # 可在 __init__.py 中控制 import *__init__.py的作用:
标识这是一个包,而不是普通的文件夹
控制在
import *时导入的模块列表(通过__all__变量)
4.2 导入包的方式
导入形式 | 代码样例 | 调用方式 | 调用方式 |
import包名.模块名 | import utils.my_fun | 包名.模块名.功能名 | utils.my_fun.log_separator1() |
from包名import模块名 | from utils import my_fun | 模块名.功能名 | my_fun.log_separator1() |
from包名import * | from utils import * | 模块名.功能名 | my_fun.log_separator1() |
from包名.模块名import功能名 | from utils.my_fun import log_separator1 | 功能名 | log_separator1() |
from包名.模块名import * | from utils.my_fun import * | 功能名 | log_separator1() |
代码示例:
假设utils/math_utils.py内容如下:
# utils/math_utils.py def add(a, b): return a + b def sub(a, b): return a - butils/__init__.py中控制导入行为:
# utils/__init__.py __all__ = ['math_utils', 'string_utils'] # 允许 from utils import * 导入这两个模块在main.py中使用:
# 方式1:import 包名.模块名 import utils.math_utils print(utils.math_utils.add(3, 5)) # 8 # 方式2:from 包名 import 模块名 from utils import math_utils print(math_utils.sub(10, 4)) # 6 # 方式3:from 包名 import *(需 __init__.py 中定义 __all__) from utils import * print(math_utils.add(2, 3)) # 5 # 方式4:from 包名.模块名 import 功能名 from utils.math_utils import add print(add(100, 200)) # 300五、总结与最佳实践
| 概念 | 说明 |
|---|---|
| 模块 | 一个.py文件,封装变量、函数、类 |
| 包 | 一个包含__init__.py的文件夹,用于组织多个模块 |
| 导入原则 | 尽量使用import 模块或from 模块 import 具体功能,避免使用import *(除非明确用__all__控制) |
__name__ | 用于区分模块是直接运行还是被导入,常用于测试代码的隔离 |
__all__ | 精细控制import *的可见范围,提升接口清晰度 |
通过合理划分模块和包,我们可以构建出结构清晰、易于维护的大型 Python 项目。现在,就动手创建你的第一个自定义模块吧!