Python 包与模块机制深度解析:从 import 到底层命名空间
在 Python 工程中,我们每天都在写 import xxx,但很少停下来思考:当解释器执行这行代码时,内存中到底发生了什么?为什么有时候 import 一个文件夹就能使用其中的功能,有时候却不行?__init__.py 到底扮演着什么角色?
本文将从模块即对象的本质出发,深入解析 Python 的包管理机制,帮你建立对 import 系统的完整认知。
Package 与 Module:容器与内容的关系
首先明确一个常被混淆的概念:Package 本质是包含 Python 文件的文件夹,而 Module 是具体的 Python 文件。
关键区别在于:Package 是一个命名空间容器,Module 是实际执行代码的单元。当你执行 import mymath 时,Python 并不是递归执行包内所有 .py 文件,而是精确地执行 mymath/__init__.py,并将这个包目录封装成一个 module 对象。
这种设计体现了 Python 的显式优于隐式哲学——你需要在 __init__.py 中明确声明"这个包对外暴露什么",而不是自动暴露所有子模块。


