摘要

本文详细讲解 Python 中模块概念、import 导入语法、from 导入语法三大核心知识点,拆解模块四大分类、导入底层原理、命名空间、__name__ == '__main__'妙用、模块别名、导入踩坑点,配套实战代码示例,适合 Python 新手夯实模块基础,可直接复制代码运行测试。

关键词:Python 模块、import、from 导入、main、命名空间

一、什么是模块

1.1 模块定义

模块是包含 Python 定义与声明的.py文件,文件名 = 模块名 [+.py](+.py) 后缀,日常编写的所有 py 文件都属于自定义模块。 Python 可导入的模块分为 4 大类:

分类说明
1自行编写的.py源码文件
2C/C++ 编译生成 DLL / 共享库扩展模块
3由多个模块组成的 Python 包
4C 语言编写、内嵌在解释器的内置模块

1.2 使用模块的目的

  1. 代码复用:相同逻辑无需重复编写;

  2. 项目解耦:大型项目拆分功能,分文件管理,便于维护迭代;

  3. 功能拆分:小项目单文件开发,大型项目按业务拆分多个模块。

二、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 步:

  1. 为被导入模块创建独立命名空间;

  2. 在该命名空间内运行模块全部代码;

  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 多模块导入 & 规范导入顺序

  1. 单行批量导入多个模块

import time, random, json, yitian
  1. 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)),否则导入优先读取本地文件,导致内置模块失效。

四、总结

  1. 模块即.py文件,四大分类,核心作用代码复用与项目拆分;

  2. import 模块:全量导入,通过模块.xx调用,独立命名空间;

  3. from 模块 import xx:局部导入,直接调用,易出现变量覆盖;

  4. if __name__ == '__main__':区分运行 / 导入场景,隔离测试代码;

  5. as统一实现模块 / 成员重命名,规范导入顺序规避项目隐患。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐