Python 模块详解:import 与 from xxx import 使用全解
摘要
本文详细讲解 Python 中模块概念、import 导入语法、from 导入语法三大核心知识点,拆解模块四大分类、导入底层原理、命名空间、__name__ == '__main__'妙用、模块别名、导入踩坑点,配套实战代码示例,适合 Python 新手夯实模块基础,可直接复制代码运行测试。
关键词:Python 模块、import、from 导入、main、命名空间
一、什么是模块
1.1 模块定义
模块是包含 Python 定义与声明的.py文件,文件名 = 模块名 [+.py](+.py) 后缀,日常编写的所有 py 文件都属于自定义模块。 Python 可导入的模块分为 4 大类:
| 分类 | 说明 |
|---|---|
| 1 | 自行编写的.py源码文件 |
| 2 | C/C++ 编译生成 DLL / 共享库扩展模块 |
| 3 | 由多个模块组成的 Python 包 |
| 4 | C 语言编写、内嵌在解释器的内置模块 |
1.2 使用模块的目的
-
代码复用:相同逻辑无需重复编写;
-
项目解耦:大型项目拆分功能,分文件管理,便于维护迭代;
-
功能拆分:小项目单文件开发,大型项目按业务拆分多个模块。
二、import 导入模块详解
导入模块第一种语法:import 模块名,导入后使用模块名.变量/函数调用内容。
2.1 实战案例
步骤 1:新建 [yitian.py](yitian.py)(被导入模块)
# yitian.py
print("片头曲. 啊! 啊~ 啊! 啊. 啊啊啊啊啊啊啊...")
# 定义变量
main_person_man = "张无忌"
main_person_woman = "赵敏敏"
low_person_man_one = "成昆"
low_person_man_two = "周芷若"
# 定义函数
def fight_on_light_top():
print("光明顶大战", main_person_man, "破坏了", low_person_man_one, "的大阴谋")
def fight_in_shaolin():
print("少林寺大战", main_person_man, "破坏了", low_person_man_two, "的大阴谋")
步骤 2:新建 jin\[_yong.py](_yong.py)(导入模块的主文件)
# jin_yong.py
# 导入倚天模块
import yitian
# 调用模块变量
print(yitian.main_person_man)
print(yitian.low_person_man_one)
# 调用模块函数
yitian.fight_in_shaolin()
yitian.fight_on_light_top()
运行jin_yong.py,会优先执行yitian.py全局打印内容,再执行主文件代码。
2.2 模块不会重复导入原理
Python 通过sys.modules缓存已导入模块,重复import不会再次执行模块内代码。
import sys
# 查看所有已加载模块
print(sys.modules.keys())
# 首次导入,执行yitian全局代码
import yitian
# 重复导入,直接读取缓存,不执行代码
import yitian
import yitian
2.3 import 导入模块底层三件事
模块首次导入时,解释器依次执行 3 步:
-
为被导入模块创建独立命名空间;
-
在该命名空间内运行模块全部代码;
-
在当前文件创建模块引用名,通过该名字访问模块内容。
通过globals()查看当前文件命名空间:
import yitian # 打印当前文件全局命名空间 print(globals())
2.4 独立命名空间:变量互不冲突
各模块拥有独立命名空间,同名变量、函数不会互相覆盖:
# jin_yong.py
import yitian
# 定义当前文件同名变量、函数
main_person_man = "胡一菲"
def fight_in_shaolin():
print(main_person_man, "大战曾小贤")
# 模块内数据
print(yitian.main_person_man) # 张无忌
# 当前文件数据
print(main_person_man) # 胡一菲
# 调用模块函数
yitian.fight_in_shaolin()
# 调用自身函数
fight_in_shaolin()
重点:
global关键字仅作用于当前模块命名空间,无法跨模块修改其他模块全局变量。
2.5 跨模块修改全局变量问题
模块仅加载一次,所有导入该模块的文件共用同一个命名空间,一处修改全文件生效:
# jin_yong.py
import yitian
# 修改导入模块的全局变量
yitian.main_person_man = "灭绝师太"
# jin_yong2.py
import yitian
import jin_yong
# 读取被修改后的值
print(yitian.main_person_man) # 灭绝师太
2.6 name == 'main' 核心用法
每个模块自带内置变量__name__:
-
模块直接作为入口运行:
__name__ = '__main__' -
模块被其他文件 import 导入:
__name__ = 模块文件名
利用该特性隔离测试代码,仅直接运行文件时执行,导入时跳过:
# yitian.py
main_person_man = "张无忌"
def fight_on_light_top():
print("光明顶大战")
# 导入时不会执行,只有直接运行本文件才执行
if __name__ == '__main__':
yitian.main_person_man = "灭绝师太"
print("哇哈哈哈哈哈")
2.7 模块别名 as 用法
导入时使用import 模块名 as 别名简化调用名称:
# 别名yt代替yitian import yitian as yt yt.fight_in_shaolin()
2.8 多模块导入 & 规范导入顺序
-
单行批量导入多个模块
import time, random, json, yitian
-
Python 官方导入规范(从上到下顺序) ① 系统内置模块(time/random/sys 等) ② 第三方扩展模块 ③ 项目自定义模块
三、from xxx import xxx 局部导入
第二种导入语法:选择性导入模块内指定变量 / 函数,导入后可直接调用,无需加模块前缀。
3.1 基础用法
# 单个导入
from yitian import fight_in_shaolin
fight_in_shaolin()
# 一次性导入多个内容
from yitian import fight_in_shaolin, fight_on_light_top, main_person_man
fight_in_shaolin()
print(main_person_man)
fight_on_light_top()
3.2 from 导入别名
# 导入变量并重命名 from yitian import main_person_man as big_lao print(big_lao)
3.3 from 导入致命坑:同名覆盖
从模块导入的变量,若当前文件定义同名变量,原导入值会被直接覆盖:
from yitian import main_person_man # 同名赋值,覆盖导入数据 main_person_man = "超级大灭绝" print(main_person_man)
⚠️ 重要避坑:自定义 py 文件名禁止和 Python 内置模块同名(如 [time.py](time.py)、[random.py](random.py)),否则导入优先读取本地文件,导致内置模块失效。
四、总结
-
模块即
.py文件,四大分类,核心作用代码复用与项目拆分; -
import 模块:全量导入,通过模块.xx调用,独立命名空间; -
from 模块 import xx:局部导入,直接调用,易出现变量覆盖; -
if __name__ == '__main__':区分运行 / 导入场景,隔离测试代码; -
as统一实现模块 / 成员重命名,规范导入顺序规避项目隐患。
更多推荐



所有评论(0)