八、Python模块、包
目录
1. 模块
1.1 什么是模块?
1.2 创建模块
1.3 导入模块
1.4 模块的命名空间
1.5 模块的搜索路径
1.6 模块的重新加载
2. 包
2.1 什么是包?
2.2 创建包
2.3 导入包中的模块
2.4 包的层次结构
3. 模块和包的管理
3.1 安装模块
3.2 卸载模块
3.3 列出已安装的模块
4. 模块和包的最佳实践
4.1 模块命名
4.2 包结构
4.3 避免循环导入
4.4使用 __all__ 控制公开接口
1. 模块
1.1 什么是模块?
一个模块是一个包含 Python 定义和语句的文件。模块的文件名以 .py
结尾。通过将代码组织到模块中,可以实现代码的复用和更好的结构化管理。
1.2 创建模块
要创建一个模块,只需在一个文件中编写 Python 代码并保存为 .py
文件。
示例:创建一个模块 mymodule.py
# 定义一个函数
def greet(name):print(f"Hello, {name}!")# 定义一个变量
version = "1.0.0"# 定义一个类
class Calculator:def add(self, a, b):return a + bdef subtract(self, a, b):return a - b
1.3 导入模块
可以使用 import
语句导入模块,并使用模块中的函数、变量和类。
示例:导入并使用 mymodule
import mymodule# 使用模块中的函数
mymodule.greet("Alice")# 使用模块中的变量
print(mymodule.version)# 使用模块中的类
calc = mymodule.Calculator()
print(calc.add(5, 3)) # 输出:8
1.4 模块的命名空间
每个模块都有自己的命名空间,这避免了名称冲突。模块中的变量、函数和类不会与导入模块的命名空间冲突。
1.5 模块的搜索路径
当你导入一个模块时,Python 会在以下位置按顺序查找模块:
-
当前工作目录。
-
PYTHONPATH
环境变量指定的目录。 -
Python 安装目录中的默认路径。
可以通过 sys.path
查看模块搜索路径:
import sys
print(sys.path)
1.6 模块的重新加载
一旦模块被导入,它就不会再次加载。如果需要重新加载模块,可以使用 importlib.reload()
。
示例:重新加载模块
import importlib
import mymodule# 修改 mymodule 后重新加载
importlib.reload(mymodule)
2. 包
2.1 什么是包?
包是一种包含多个模块的文件夹,用于组织模块的层次结构。包必须包含一个 __init__.py
文件(可以为空),以标识这是一个包。
2.2 创建包
要创建一个包,只需创建一个文件夹,并在其中添加 __init__.py
文件和其他模块文件。
示例:创建包 mypackage
mypackage/
├── __init__.py
├── module1.py
└── module2.py
__init__.py
的内容
# 可以在 __init__.py 中初始化包或定义包级别的变量
print("Package initialized.")
module1.py
的内容
def func1():print("Function 1 from module1.")
module2.py
的内容
def func2():print("Function 2 from module2.")
2.3 导入包中的模块
可以使用 import
语句导入包中的模块。
示例:导入并使用包中的模块
# 导入整个包
import mypackage# 导入包中的特定模块
import mypackage.module1
import mypackage.module2# 使用模块中的函数
mypackage.module1.func1()
mypackage.module2.func2()
或使用 from ... import ...
语法
from mypackage import module1, module2module1.func1()
module2.func2()
或直接导入函数
from mypackage.module1 import func1
from mypackage.module2 import func2func1()
func2()
2.4 包的层次结构
可以创建嵌套的包结构,以实现更复杂的层次组织。
示例:创建嵌套包
mypackage/
├── __init__.py
├── submodule/
│ ├── __init__.py
│ ├── submodule1.py
└── module1.py
导入嵌套包中的模块
from mypackage.submodule.submodule1 import func
3. 模块和包的管理
3.1 安装模块
可以使用 pip
安装第三方模块。
示例:安装 requests
模块
pip install requests
3.2 卸载模块
可以使用 pip
卸载已安装的模块。
示例:卸载 requests
模块
pip uninstall requests
3.3 列出已安装的模块
可以使用 pip list
查看已安装的模块。
pip list
4. 模块和包的最佳实践
4.1 模块命名
模块名应简洁明了,避免使用保留字和内置函数名。
4.2 包结构
合理设计包的结构,避免过深的嵌套。包的层次结构应反映项目的逻辑结构。
4.3 避免循环导入
循环导入(即两个模块互相导入)会导致错误,应尽量避免。
4.4使用 __all__
控制公开接口
可以在模块中定义 __all__
列表,指定哪些名称会被 from module import *
导入。
示例:定义 __all__
__all__ = ["func1", "func2"]