Python模块进阶:教你写出可维护、可复用的高质量代码

11 阅读3分钟

一、什么是模块,为什么要用模块?

在Python中,模块就是一个.py文件。它把函数、类和变量组织到一个独立空间里,从而实现代码复用、分层管理和冲突隔离。

简单来说:

  • 用模块,代码更整洁
  • 提升协作与维护效率
  • 有利于项目扩展和调试

例子: 一个名为math_utils.py的模块可以专门放与你数学相关的函数与类。

二、模块的导入与使用

最基础的用法就是 import

# 文件 math_utils.py
def add(a, b):
    return a + b

# 在其他.py文件或Py交互环境中
import math_utils
print(math_utils.add(2, 3))

2.1 其他导入方式

  • 只导入部分成员
    from math_utils import add
  • 为模块或成员起别名
    import math_utils as mu
    from math_utils import add as fast_add
  • 一次性导入多个成员
    from math_utils import add, sub, mul
  • 导入整个包(见高级部分)

2.2 导入机制底层探索

  • Python会把已经导入的模块缓存到sys.modules
  • 自定义模块首先在当前目录查找,找不到再走sys.path

三、__name____main__:模块的自检与执行

每个模块有一个内置的__name__变量。

# utils.py
def hello():
    print("Hello!")

if __name__ == '__main__':
    hello()   # 只有当直接运行utils.py时才执行这行

用途?

  • 让模块既能被导入又能独立运行,适用于脚本和工具开发。

四、包(Package)与多级模块

一个包就是包含__init__.py文件的文件夹,可以嵌套模块和子包。

目录结构样例:

my_proj/
  __init__.py
  core.py
  math_utils.py
  string_utils.py
  data/
    __init__.py
    csv_tools.py

导入用法:

from my_proj.data.csv_tools import read_csv
  • 注意:空的__init__.py即可标记包,没它就不是包!

五、模块的命名空间与作用域

  • 重名怎么办?用“全路径”区分(from my_proj.core import func
  • 避免 from xxx import *,容易引发命名冲突

六、模块的常见高级用法

6.1 模块重载与懒加载

  • 开发调试时,用importlib.reload(mod)重新加载模块
  • 第三方大包可以用importlib进行延迟加载,优化性能

6.2 __all__控制导入可见性

all  是针对模块公开接口的一种约定,比起双下划线的方式(私有变量或者私有函数), all 以提供了”白名单“的形式暴露接口 在模块里:

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def _divide(a, b):
    if b != 0:
        return a / b
    else:
        return "Error: Division by zero"

__all__ = ['subtract', 'add']
# __all__ = ['safe_function', 'important_class']

这样 from mod import * 只导入__all__里的内容

6.3 模块搜索路径自定义

环境变量PYTHONPATH、代码动态调整sys.path,都可以控制模块查找范围。

import sys
sys.path.append('/my/custom/path')

6.4 绝对导入和相对导入

  • 绝对:from my_proj.core import func
  • 相对:from .core import func,适合多文件大项目

七、Python标准库和第三方模块

7.1 标准库:自带诸多高效模块

ossysdatetimejsoncollections等。

7.2 安装第三方模块

  • 用pip:pip install requests
  • 虚拟环境隔离:python -m venv venv

八、模块化项目组织最佳实践

  • 每个功能区块一个包,逻辑分层
  • 使用__init__.py导出核心API
  • 公私成员用下划线约定(如 _internal_func
  • 入口脚本单独放(如main.pyrun.py

如果你喜欢这篇文章,欢迎点赞、收藏和转发,更多Python干货内容敬请关注!