文章目录
- 一、模块导入的基础语法
-
- [1. 导入整个模块](#1. 导入整个模块)
- [2. 导入模块中的指定功能](#2. 导入模块中的指定功能)
- [3. 导入模块的所有功能(不推荐)](#3. 导入模块的所有功能(不推荐))
- [4. 给模块 / 功能指定别名](#4. 给模块 / 功能指定别名)
- 二、自定义模块的导入
- [三、关键知识点:all------ 控制模块的公开接口](#三、关键知识点:all—— 控制模块的公开接口)
- [四、关键知识点:main------ 区分模块的运行方式](#四、关键知识点:main—— 区分模块的运行方式)
- 五、避坑指南
- 总结
在 Python 开发中,模块是代码组织与复用的核心机制之一。一个 Python 文件(.py)就是一个模块,它可以包含函数、类、变量等代码单元,让我们能更高效地管理项目结构。今天我们就从模块导入语法入手,深入解析常见用法,深挖__all__和__main__这两个核心知识点。
一、模块导入的基础语法
Python 提供了多种模块导入方式,不同写法对应不同的使用场景:
1. 导入整个模块
python
import time # 导入内置time模块
print("你好")
time.sleep(5) # 通过"模块名.功能"调用
print("我好")
特点:导入模块的所有内容,需通过模块名.功能访问;避免命名冲突,但调用时略繁琐。
2. 导入模块中的指定功能
python
from time import sleep # 仅导入sleep函数
print("你好")
sleep(5) # 直接调用功能,无需模块名
print("我好")
特点:只导入需要的功能,调用更简洁;但如果多个模块有同名功能,会出现命名冲突。
3. 导入模块的所有功能(不推荐)
python
from time import * # *表示导入所有公开功能
print("你好")
sleep(5)
print("我好")
风险:
可能导入大量不需要的功能,污染当前命名空间;
若模块未显式控制接口,容易出现命名冲突。
4. 给模块 / 功能指定别名
python
# 给模块指定别名
import time as t
t.sleep(5)
# 给功能指定别名
from time import sleep as sl
sl(5)
适用场景:模块名 / 功能名过长时简化代码,或解决同名冲突(如from module1 import func as f1)。
二、自定义模块的导入
每个 Python 文件都可以作为自定义模块,模块名就是文件名(需符合标识符命名规则)。
示例:
1.新建文件my_module1.py,写入功能:
python
def test(a, b):
print(a + b)
2,在其他文件中导入:
python
# 方式1:导入整个模块
import my_module1
my_module1.test(1, 2) # 输出3
# 方式2:导入指定功能
from my_module1 import test
test(1, 2) # 输出3
三、关键知识点:all------ 控制模块的公开接口
__all__是模块内的字符串列表,专门用于约束from module import *的导入范围,是 Python 模块化设计中 "控制接口暴露" 的核心工具。
- __all__的作用
显式定义模块对外暴露的公开成员(函数、类、变量等);
仅影响from module import *的行为,对显式导入(如from module import func)无限制。 - 示例:
在my_module1.py中添加__all__:
python
__all__ = ["test"] # 仅允许导入test函数
def test(a, b):
print(a + b)
def hidden_func(): # 不在__all__中,不会被import *导入
print("这是内部函数")
导入测试:
python
from my_module1 import *
test(1,2) # 正常执行
hidden_func() # 报错:NameError(未导入)
- 无__all__时的默认规则
若模块未定义__all__,from module import *会导入所有非单下划线开头的成员(遵循 "单下划线为内部成员" 的约定)。
四、关键知识点:main------ 区分模块的运行方式
main__是 Python 的特殊模块名,通过__name == "main"可判断模块是直接运行还是被导入,常用于分离测试代码与功能代码。
- __name__的取值规则
当模块直接运行(如python my_module1.py),__name__被设为"main ";
当模块被导入(如import my_module1),__name__被设为模块名(如"my_module1")。 - 示例:
在my_module1.py中添加测试代码:
python
def test(a, b):
print(a + b)
if __name__ == "__main__":
# 只有模块直接运行时,这部分代码才会执行
print("模块被直接运行,执行测试:")
test(1,2) # 输出3
直接运行python my_module1.py:执行测试代码,输出 "模块被直接运行...";
导入my_module1时:测试代码不会执行,仅提供test函数。
- 常见用途
编写模块的单元测试(直接运行模块时执行测试);
定义脚本的主程序入口(避免导入时执行不必要的代码)。
五、避坑指南
1.避免滥用from module import :易造成命名冲突,推荐显式导入需要的功能;
2.模块导入位置 :建议写在代码文件的开头,提高可读性;
3.同名功能冲突:导入不同模块的同名功能时,使用别名区分(如from m1 import test as t1)。
总结
模块是 Python 代码组织的基础,掌握导入语法、all (控制接口)、main(区分运行方式),能让你写出更规范、可维护的代码。