On this page

Python 模块

Python 模块全面指南

模块(Module)是Python代码组织的基本单元,允许你将相关的代码组织到一个文件中,便于重用和维护。

1. 模块基础

什么是模块?

  • 一个包含Python定义和语句的.py文件
  • 模块名就是文件名去掉.py后缀
  • 可以包含函数、类、变量和可执行代码

创建模块示例

创建一个名为mymodule.py的文件:

# mymodule.py
def greet(name):
    return f"Hello, {name}!"

PI = 3.14159

class Calculator:
    def add(self, a, b):
        return a + b

2. 模块导入方式

基本导入

# 导入整个模块
import mymodule

print(mymodule.greet("Alice"))  # 使用模块名前缀
print(mymodule.PI)

calc = mymodule.Calculator()

从模块导入特定内容

from mymodule import greet, PI

print(greet("Bob"))  # 直接使用,无需模块名前缀
print(PI)

导入所有内容(不推荐)

from mymodule import *  # 导入所有非下划线开头的名称

print(greet("Charlie"))
print(PI)

给模块或导入内容起别名

import mymodule as mm
from mymodule import greet as hello

print(mm.PI)
print(hello("Dave"))

3. 模块搜索路径

Python解释器按以下顺序查找模块:

  1. 当前目录
  2. PYTHONPATH环境变量指定的目录
  3. Python安装目录的标准库
  4. 第三方库目录(site-packages)

查看模块搜索路径:

import sys
print(sys.path)

4. 标准库模块示例

Python内置了大量有用的标准库模块:

math - 数学运算

import math

print(math.sqrt(16))  # 4.0
print(math.pi)        # 3.141592653589793

os - 操作系统接口

import os

print(os.getcwd())  # 获取当前工作目录
os.mkdir("new_dir") # 创建目录

datetime - 日期时间

from datetime import datetime

now = datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S"))

random - 随机数

import random

print(random.randint(1, 10))  # 1到10的随机整数
print(random.choice(["a", "b", "c"]))

5. 模块的特殊变量

每个模块都有一些内置的特殊变量:

__name__

  • 当模块被直接运行时,值为"__main__"
  • 当模块被导入时,值为模块名
# mymodule.py
if __name__ == "__main__":
    print("模块被直接运行")
else:
    print("模块被导入")

__file__

print(__file__)  # 当前模块的文件路径

6. 包(Package)

包是包含多个模块的目录,必须有__init__.py文件:

my_package/
├── __init__.py
├── module1.py
└── module2.py

导入包中的模块

from my_package import module1
import my_package.module2

__init__.py文件

  • 可以是空文件
  • 可以包含初始化代码
  • 可以定义__all__列表控制from package import *的行为

7. 第三方模块安装

使用pip安装第三方模块:

pip install requests numpy pandas

然后在Python中使用:

import requests
import numpy as np
import pandas as pd

8. 模块重载

默认情况下,模块只导入一次。要重新加载模块:

import importlib
import mymodule

importlib.reload(mymodule)  # 重新加载模块

9. 模块最佳实践

  1. 模块命名:使用小写字母和下划线,如my_module.py
  2. 导入顺序:按标准库、第三方库、本地模块分组
  3. 避免循环导入:模块A导入模块B,模块B又导入模块A
  4. 文档字符串:为模块和重要函数添加文档
  5. 测试代码:使用if __name__ == "__main__":包含测试代码

10. 实际应用示例

创建自定义工具模块

# utils.py
"""常用工具函数集合"""

import os
from datetime import datetime

def get_file_size(filepath):
    """返回文件大小(字节)"""
    return os.path.getsize(filepath)

def format_timestamp(timestamp):
    """格式化时间戳为可读字符串"""
    return datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S")

if __name__ == "__main__":
    # 测试代码
    print(get_file_size(__file__))
    print(format_timestamp(1625097600))

使用自定义模块

from utils import get_file_size, format_timestamp

print(f"当前文件大小: {get_file_size(__file__)}字节")
print(f"格式化时间: {format_timestamp(1625097600)}")

11. 常见问题

  1. 模块找不到(ModuleNotFoundError)

    • 确保模块在搜索路径中
    • 检查文件名和拼写
    • 确保目录有__init__.py(对于包)
  2. 循环导入

    • 重构代码消除循环依赖
    • 将导入移到函数内部
  3. 名称冲突

    • 避免与标准库同名
    • 使用明确的命名
  4. 导入性能

    • 导入是相对昂贵的操作
    • 将不常用的导入放在函数内部

总结

Python模块系统提供了强大的代码组织能力:

特性描述
代码重用避免重复代码
命名空间避免名称冲突
组织性逻辑分组相关代码
可维护性便于团队协作开发

掌握模块和包的使用是Python开发的重要基础,能够帮助你构建更大型、更可维护的应用程序。