You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python模块是否有code object属性及导入执行机制问询

模块的Code Object与导入执行机制

好问题!这涉及到Python模块加载和执行的核心机制,我来一步步给你拆解:

模块对象是否拥有code object属性?

当然有!模块对象和函数对象类似,都带有一个__code__属性,这就是它对应的code object。这个对象包含了模块级所有代码的编译信息,包括字节码、常量池、局部变量名等。

你可以自己验证一下:创建一个简单的模块文件my_module.py,然后在另一个脚本里导入它并查看:

import my_module
print(my_module.__code__)
# 输出类似:<code object <module> at 0x10abc1230, file "my_module.py", line 1>

Python是否通过执行模块code object的bytecode来运行模块内部代码?

是的!模块的初始化过程本质上就是执行其code object的字节码。当模块第一次被导入时,Python会把模块的源代码编译成这个code object,然后通过执行它的字节码来完成模块的初始化——包括执行模块级语句、定义函数/类、初始化变量等。

导入模块并实例化模块对象时,Python的具体操作步骤

当你执行import my_module时,Python会按以下流程处理:

  • 检查缓存:首先查看sys.modules字典,如果模块已经被加载过,直接返回已有的模块对象,不会重复执行代码。
  • 编译源代码:如果模块未被加载,Python会找到对应的.py文件,读取源代码并编译成code object(同时生成字节码,也就是my_module.__code__.co_code)。
  • 创建模块对象:实例化一个types.ModuleType类型的对象,设置它的__name__、__file__、__doc__等基础属性。
  • 执行字节码:将模块对象作为全局命名空间,执行code object的字节码。这个过程中:
    • 运行模块级的所有语句(比如变量赋值、打印操作)
    • 定义函数和类(本质是创建函数对象、类对象,并将它们绑定为模块的属性)
  • 缓存模块:把初始化完成的模块对象存入sys.modules,后续再次导入时直接复用。

举个直观的例子:如果my_module.py里有如下代码:

# my_module.py
print("正在初始化模块")
MODULE_VAR = 100
def hello():
    return "Hello from module"

当你第一次导入它时,会打印"正在初始化模块",同时MODULE_VAR和hello都会成为my_module对象的属性——这就是执行模块code object字节码的结果。

内容的提问来源于stack exchange,提问作者doUWannaBuildASnowMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:27:53