【学Python自动化】 6. Python 模块系统学习笔记

一、模块基础

什么是模块?

  • 包含 Python 定义和语句的 .py 文件

  • 解决代码复用和组织问题

  • 每个模块有自己的命名空间

创建模块示例


# fibo.py - 斐波那契模块
def fib(n):
    """打印小于n的斐波那契数列"""
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a + b
    print()

def fib2(n):
    """返回小于n的斐波那契数列列表"""
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a + b
    return result

二、模块详解

导入方式

  1. 基本导入

import fibo
fibo.fib(1000)  # 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
fibo.fib2(100)  # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
  1. 导入特定函数

from fibo import fib, fib2
fib(500)  # 直接使用,无需模块名前缀
  1. 导入所有(不推荐)

from fibo import *  # 可能污染命名空间
  1. 使用别名

import fibo as fib
fib.fib(500)

from fibo import fib as fibonacci
fibonacci(500)

模块特性

  • 一次性初始化:模块代码只在第一次导入时执行

  • 独立命名空间:避免命名冲突

  • 可重载:使用 importlib.reload()

1 以脚本方式执行模块

双重用途模式


# 在模块末尾添加:
if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

使用方法:


# 作为脚本执行
python fibo.py 50
# 输出: 0 1 1 2 3 5 8 13 21 34

# 作为模块导入
import fibo  # 不执行测试代码
2 模块搜索路径

Python 搜索模块的顺序:

  1. 内置模块 (sys.builtin_module_names)

  2. sys.path 中的目录:

  • 当前脚本目录

  • PYTHONPATH 环境变量

  • 标准库和 site-packages


import sys
print(sys.path)  # 查看搜索路径
sys.path.append('/my/module/path')  # 添加自定义路径
3 编译的 Python 文件
  • 缓存文件:pycache/module.version.pyc

  • 自动对比源码修改日期

  • 提高加载速度,不影响执行速度

优化选项:


python -O script.py    # 去除断言
python -OO script.py   # 去除断言和文档字符串

三、标准模块

常用标准模块


import sys

# 交互模式提示符
sys.ps1 = 'C> '  # 主提示符
sys.ps2 = '... '  # 次提示符(仅交互模式)

# 模块搜索路径操作
sys.path.append('/ufs/guido/lib/python')

# 平台特定模块
try:
    import winreg  # 仅Windows可用
except ImportError:
    print("winreg module not available")

四、dir() 函数

查看对象内容


import fibo, sys

# 查看模块内容
print(dir(fibo))  # ['__name__', 'fib', 'fib2']
print(dir(sys))   # 显示sys模块的所有属性

# 查看当前命名空间
a = [1, 2, 3, 4, 5]
import fibo
fib = fibo.fib
print(dir())  # 显示所有当前定义的名称

# 查看内置函数
import builtins
print(dir(builtins))

五、包(Package)

包的结构


sound/                          # 顶层包
      __init__.py               # 初始化包(必需)
      formats/                  # 子包
              __init__.py
              wavread.py
              wavwrite.py
      effects/                  # 子包
              __init__.py
              echo.py
              surround.py
      filters/                  # 子包
              __init__.py
              equalizer.py

导入方式

  1. 绝对导入

import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
  1. 从包中导入模块

from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)
  1. 直接导入函数

from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)
1 从包中导入 *

控制导入内容


# sound/effects/__init__.py
__all__ = ["echo", "surround", "reverse"]

# 使用
from sound.effects import *  # 只导入 __all__ 中指定的模块

注意事项


# 如果本地有同名函数,会覆盖子模块
__all__ = ["echo", "surround", "reverse"]

def reverse(msg: str):  # 这会覆盖 reverse.py 子模块
    return msg[::-1]
2 相对导入

包内模块引用


# 在 sound/effects/surround.py 中
from . import echo        # 从当前包导入
from .. import formats    # 从上级包导入  
from ..filters import equalizer  # 从兄弟包导入

注意: 主模块必须使用绝对导入

3 多目录中的包

扩展包路径


# 修改包的搜索路径
import mypackage
mypackage.__path__.append("/path/to/extra/modules")

六、⚡ 重要特性总结

模块特性

  • name 变量:模块名,“main” 表示直接运行

  • 独立命名空间:避免全局变量污染

  • 一次性初始化:避免重复执行初始化代码

包特性

  • 必须包含 init.py:标识目录为包

  • 分层组织:使用点号表示法

  • 相对导入:支持包内模块间的相对引用

最佳实践

  • 使用绝对导入:提高代码可读性和可维护性

  • 避免 from module import *:明确导入所需内容

  • 使用 if name == “main”:使模块可执行也可导入

  • 合理组织包结构:按功能划分模块

七、🔧 实用技巧

动态导入


# 按需导入模块
module_name = "json"
json = __import__(module_name)

# 使用 importlib
import importlib
json = importlib.import_module("json")

查看模块信息


import math

print(math.__name__)    # 模块名
print(math.__file__)    # 模块文件路径
print(math.__doc__)     # 模块文档字符串

重载模块


# 开发时重新加载模块
import importlib
importlib.reload(module_name)

八、🎯 模块系统优势

  • 代码复用:避免重复造轮子

  • 命名空间管理:避免命名冲突

  • 代码组织:大型项目的结构化基础

  • 维护性:便于团队协作和代码维护

Python 的模块系统是其生态系统繁荣的基础,理解和熟练使用模块系统是成为 Python 开发高手的关键一步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuyuan77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值