在 Python 中,模块(module)通常被视为“代码的组织单元”或“命名空间的载体”。但从对象模型的角度看,模块并非一种语法概念,而是运行期真实存在的对象。解释器并不是“加载一段文件”,而是创建一个模块对象(module object),并在其中执行代码

理解模块对象,是理解 Python 导入机制、全局命名空间、依赖管理以及运行期动态行为的关键。

一、模块不是语法结构,而是运行期对象

在 Python 的对象模型中,模块对象(module object)是一等对象,具备与函数对象、类对象同等的地位:

• 具有身份(identity)

• 具有类型(module)

• 具有可变的运行期状态

模块并不是“源文件本身”,也不是“代码对象的集合”,而是解释器在导入阶段创建的,用于承载模块级执行结果与全局命名空间的对象

源文件只是模块对象创建与初始化的输入材料,而非模块的本体。

二、模块对象的产生:从导入到执行

模块对象并非在程序启动时一次性创建,而是在导入语句触发时,由解释器按需构造。

当解释器执行如下语句时:

import math

其内部过程可以概括为以下几个阶段:

1、解析模块名并定位模块资源

2、创建一个新的模块对象

3、为模块对象初始化独立的全局命名空间

4、在该命名空间中执行模块代码

5、将模块对象绑定到当前命名空间中的名称

需要注意的是:

• 模块代码的执行,发生在模块对象的上下文中

• 模块对象在结构上先于模块代码执行而存在

因此,模块对象并不是“代码执行后的结果”,而是代码执行的载体。

三、模块对象与代码对象、帧对象的协作关系

模块对象并不独立完成执行,而是与代码对象、帧对象协同工作。

在模块导入过程中,三者的职责分工是:

代码对象:描述模块级代码的执行结构

模块对象:承载模块级全局命名空间

帧对象:承载模块代码的一次具体执行过程

当模块被首次导入时:

1、解释器为模块代码创建对应的代码对象

2、创建模块对象并初始化其

3、创建模块级帧对象,用于执行模块代码

模块级代码的执行,本质上就是:在模块对象的命名空间中,运行一次模块代码对应的帧对象

四、模块对象的核心语义:全局命名空间容器

模块对象最核心、也是最稳定的职责,是作为模块级全局命名空间的对象化载体

模块中定义的:

• 函数

• 类

• 字面量

• 其它名称

并不是“属于文件”,而是作为属性,绑定在模块对象之上。

例如:

math.sin

这里的 math.sin,本质上是在 math 模块对象的属性字典中查找名称 sin。

模块对象的 __dict__,正是解释器进行模块级名称解析的基础。

五、模块对象的缓存与唯一性

模块对象具有一个非常重要的运行期特性:缓存与复用。

当某模块被成功导入后,其模块对象会被存入 sys.modules。

后续对同一模块的导入请求,不会再次创建模块对象,而是直接返回已有的模块对象引用

因此:

• 模块对象在进程内具有事实上的唯一性。该唯一性依赖于 import 系统与 sys.modules 的约定,而非对象模型的硬性限制

• 模块级代码默认只会执行一次

这也是模块常被用于:

• 单例式资源管理

• 配置集中存放

• 全局状态维护

的根本原因。

六、模块对象的可变性与动态特征

模块对象并非只读容器,而是完全可变的运行期对象。

在程序运行过程中:

• 可以向模块对象动态添加属性

• 可以替换模块对象中的已有绑定

• 甚至可以在运行期构造新的模块对象

例如:

m.value = 42

这再次表明,模块并不是“静态结构”,而是一个可操作、可演化的对象。

七、模块对象与作用域边界

模块对象在 Python 的作用域模型中处于一个关键位置:模块级命名空间是函数局部作用域的外层,也是内置命名空间之前的最后一层

在 LEGB 规则中,G(Global)并非“程序全局”,而是“函数所隶属模块的命名空间”。

换言之,模块对象定义了“全局”这一概念的真实边界。

八、为什么模块必须是对象

如果模块不是对象,而只是代码容器,将无法支持以下能力:

• 模块缓存与重复导入消除

• 动态导入与插件机制

• 运行期模块替换与代理

• 模块级状态管理

通过将模块设计为对象,Python 得以:

• 将导入行为对象化

• 将命名空间与执行结果统一管理

• 将依赖关系纳入对象模型体系

小结

模块对象是 Python 对象模型中用于承载模块级执行结果与全局命名空间的一等对象。模块导入的本质,是创建模块对象并在其上下文中执行模块代码。通过将模块设计为可缓存、可变的运行期对象,Python 在保持语义简洁的同时,实现了高度动态、可组合的模块系统。

理解模块对象,有助于从对象模型层面把握 Python 的导入机制、作用域规则与运行期行为。

打开网易新闻 查看精彩图片

点赞有美意,赞赏是鼓励