目录
1. 模块 Module
2. 导入模块
2.1 导入一个或多个模块
2.2 导入模块的指定功能
2.3 导入模块的全部功能
2.4 给导入的模块或功能取别名
3. 自定义模块
3.1 __name__属性
3.2 __all__属性
4. 包 Package
5. 导入包
5.1 导入包的指定模块
5.2 导入包的指定模块的指定功能
5.3 导入包的指定模块的全部功能
6. __init__.py通过__all__控制允许导入的模块
1. 模块 Module
模块是什么?
- 模块是一个py文件,后缀名.py
- 模块可以定义函数、类和变量,模块里也可能包含可执行的代码
模块的作用有哪些?
- 当函数、类和变量很多时,可以很好地进行管理。
- 开发中,程序员可以根据业务需要,把同一类型功能代码,写到一个模块文件中,既方便管理,也方便调用。
- 一个模块就是一个工具包,供程序员开发使用,提高开发效率。
- Python自带标准模块库,每个模块可以帮助程序员快速实现相关功能。
标准模块库:
10. 标准库简介 — Python 3.13.1 文档
11. 标准库简介 —— 第二部分 — Python 3.13.1 文档
模块索引:
Python 模块索引 — Python 3.13.1 文档
2. 导入模块
2.1 导入一个或多个模块
# 导入一个模块
import math# 导入多个模块
# 写法一:一行导入多个模块
# import re, datetime
# 写法二:一行导入一个模块,分成多行
import re
import datetime# 使用方法:模块.功能
print(math.sqrt(9))
print(re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10'))
print(datetime.date.today())
2.2 导入模块的指定功能
from math import sqrt, ceil
from datetime import date# 使用方法:直接使用,不用带模块名
print(ceil(sqrt(10)))
print(date.today())
2.3 导入模块的全部功能
from math import *
from datetime import *# 使用方法:直接使用,不用带模块名
print(ceil(sqrt(10)))
print(date.today())
2.4 给导入的模块或功能取别名
# 给导入的模块取别名
import math as m# 给导入的功能取别名
from datetime import date as dt# 使用方法:直接使用别名替代原名
print(m.sqrt(9))
print(dt.today())
3. 自定义模块
3.1 __name__属性
__name__用于在导入系统中唯一地标识模块的名称, 对于直接执行的模块,这将被设为"__main__"
导入模块时,其实会执行整个模块的代码。如果我们不想某些代码在被导入时执行,就要用到if __name__ == '__main__':
# cal.py
def add(x, y):return x + yif __name__ == '__main__':print(__name__)print("我是直接执行的")
else:print(__name__)print("我是被导入执行的")
# test.py
from cal import addprint(add(1, 2))
运行cal.py:
运行test.py:
3.2 __all__属性
__all__可以控制from 模块 import *时,哪些功能被导入。
import 模块和from 模块 import 功能不受__all__的限制。
# cal.py
def add(x, y):return x + ydef subtract(x, y):return x - y__all__ = ['add']
from 模块 import *受__all__限制:
# test.py
from cal import *print(add(1, 2))
print(subtract(1, 2))
import 模块不受__all__限制:
# test.py
import calprint(cal.add(1, 2))
print(cal.subtract(1, 2))
from 模块 import 功能不受__all__限制:
# test.py
from cal import add, subtractprint(add(1, 2))
print(subtract(1, 2))
4. 包 Package
包是组织多个相关模块的一种方式,通过将多个模块组织在一起,包可以提供一个包含子目录的目录树结构,使得模块可以在其中按逻辑分组。这不仅有助于管理大型软件项目中的文件,也有助于避免命名冲突,因为包名作为前缀可以为模块名提供独特的命名空间。
这里给出了一种可能的包结构(在分层的文件系统中):
sound/ 最高层级的包
__init__.py 初始化 sound 包
formats/ 用于文件格式转换的子包
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ 用于音效的子包
__init__.py
echo.py
surround.py
reverse.py
...
filters/ 用于过滤器的子包
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
需要有 __init__.py 文件才能让 Python 将包含该文件的目录当作包来处理(除非使用 namespace package,这是一个相对高级的特性)。 这可以防止重名的目录如 string 在无意中屏蔽后继出现在模块搜索路径中的有效模块。 在最简单的情况下,__init__.py 可以只是一个空文件,但它也可以执行包的初始化代码或设置 __all__ 变量。
5. 导入包
5.1 导入包的指定模块
# 方法一:
import 包.模块
# 使用方法:包.模块.功能# 方法二:
from 包 import 模块
# 使用方法:模块.功能
5.2 导入包的指定模块的指定功能
from 包.模块 import 功能
# 使用方法:直接使用,不用带包名和模块名
5.3 导入包的指定模块的全部功能
from 包.模块 import *
# 使用方法:直接使用,不用带包名和模块名
6. __init__.py通过__all__控制允许导入的模块
__all__可以控制from 包.模块 import *时,哪些功能被导入。其他导入包的方式不受__all__的限制。