模块与包
什么是模块
模块是一个包含Python代码的文件,它可以定义函数、类和变量。使用模块可以将代码组织成可重用的单元。
# mymodule.py
def greet(name):
return f"你好,{name}!"
PI = 3.14159
class Calculator:
def add(self, a, b):
return a + b
导入模块
Python提供了多种导入模块的方式。
# 导入整个模块
import math
print(math.sqrt(16)) # 输出: 4.0
# 导入特定函数
from math import sqrt, pi
print(sqrt(16)) # 输出: 4.0
print(pi) # 输出: 3.141592653589793
# 导入并重命名
import numpy as np
arr = np.array([1, 2, 3])
# 导入模块所有内容(不推荐)
from math import *
__name__变量
__name__变量用于区分模块是被导入还是直接运行。
# calculator.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
# 只在直接运行时执行
if __name__ == "__main__":
print("测试代码")
print(add(1, 2))
print(subtract(5, 3))
包的结构
包是包含__init__.py文件的目录,用于组织相关的模块。
mypackage/
__init__.py
module1.py
module2.py
subpackage/
__init__.py
module3.py
# mypackage/__init__.py
from .module1 import function1
from .module2 import Class2
# 使用包
from mypackage import function1, Class2
from mypackage.subpackage import module3
pip包管理
pip是Python的包管理工具,用于安装和管理第三方包。
# 安装包
pip install requests
# 安装特定版本
pip install requests==2.28.0
# 升级包
pip install --upgrade requests
# 卸载包
pip uninstall requests
# 查看已安装的包
pip list
# 查看包信息
pip show requests
# 从requirements.txt安装
pip install -r requirements.txt
创建自己的包
创建一个Python包需要遵循特定的目录结构和配置。
# setup.py
from setuptools import setup, find_packages
setup(
name="my_package",
version="0.1.0",
packages=find_packages(),
install_requires=[
"requests>=2.28.0",
],
author="Your Name",
author_email="your.email@example.com",
description="我的第一个Python包",
)
模块搜索路径
Python在导入模块时会按照特定顺序搜索模块位置。
import sys
# 查看模块搜索路径
print(sys.path)
# 添加自定义搜索路径
sys.path.append('/path/to/my/modules')
# 现在可以导入该路径下的模块
import my_module
相对导入与绝对导入
在包内部,可以使用相对导入或绝对导入。
# 相对导入
from . import module1
from .. import parent_module
from .subpackage import module3
# 绝对导入
from mypackage import module1
from mypackage.subpackage import module3
命名空间包
Python 3.3+支持命名空间包,允许包分布在多个目录中。
# namespace_package.py
# 不需要__init__.py文件
# 包可以分布在多个位置
# 在package1目录
# mypackage/module_a.py
# 在package2目录
# mypackage/module_b.py
# 两个目录可以合并为一个包
from mypackage import module_a, module_b
最佳实践
- 使用
if __name__ == "__main__"保护测试代码 - 优先使用相对导入,避免循环导入
- 为包创建
__init__.py文件,明确包的公共接口 - 使用
requirements.txt记录项目依赖 - 遵循PEP 8命名规范,模块名使用小写字母和下划线
- 定期更新依赖包,修复安全漏洞
模块与包是Python代码组织的基础,掌握它们能让你构建更大型、更易维护的项目。