Python的底层内存模型之模块、类、对象的存储与运行机制

 更新时间:2026年02月24日 11:11:28   作者:勇往直前plus  
这篇文章介绍了Python的底层内存模型之模块、类、对象的存储与运行机制,从内存布局、对象存储、属性管理三个核心维度,总结汇总 Python 的底层内存模型和运行机制,感兴趣的朋友跟随小编一起看看吧

前言

这篇博客从内存布局、对象存储、属性管理三个核心维度,总结汇总 Python 的底层内存模型和运行机制

一、先编译,后解释

Python 既非纯编译型也非纯解释型语言,其运行流程可概括为:

源代码(.py) → 编译生成字节码(.pyc) → Python虚拟机(PVM)解释执行字节码 → 与操作系统交互
  • 编译阶段:解释器将源代码转为字节码(中间代码),并缓存到__pycache__目录,重复运行时直接加载字节码提升效率;
  • 执行阶段:Python 虚拟机(PVM)逐行解释字节码,翻译成机器指令执行;
  • 核心特性:CPython 的 GIL(全局解释器锁)限制同一时刻仅一个线程执行字节码,这也是 Python 多线程在 CPU 密集型任务中效率不高的核心原因。

Python 无 Java 式严格的 “堆、栈、方法区” 物理划分,但从开发者视角可简化为两大核心区域:

区域核心作用存储内容
栈帧区临时存储函数调用上下文局部变量、参数的引用(地址)
堆区存储所有实际数据所有对象(实例、类、模块、函数等)

二、模块对象:.py 文件的 “属性容器”

当我们导入模块或运行.py文件时,Python 解释器会为该文件创建一个模块对象****(module 类型实例),这是模块级内容的核心载体。

  1. 模块对象的核心特性
  • 创建时机:import模块或运行脚本时自动创建,创建后缓存到sys.modules(字典,key 为模块名,value 为模块对象的引用地址);
  • 存储内容:模块的__dict__属性是其核心,等价于全局命名空间(globals()返回的就是该字典),包含:
    • 自定义内容:全局变量、类、函数;
    • 内置属性:file(文件路径)、name(模块名)等;
  • 特殊场景:直接运行的脚本会被命名为__main__模块,这也是if name == "main"的底层逻辑。
  1. __file__指向文件路径
    __file__并非代码 “查找” 的结果,而是解释器在创建模块对象时,主动将文件路径赋值给模块对象的内置属性 —— 它是模块对象的 “路径标签”,而非运行时动态查找的结果。

三、包的加载

  1. python在加载模块时,会先加载模块所在的包,当包第一次被导入时,Python 会执行 __init__.py 中的所有代码,可以在这里做初始化操作(比如加载配置、初始化常量、检查依赖等)
  2. 当我们执行 import my_package 或 from my_package import utils 时,Python 会按以下步骤把包 / 模块加载成模块对象(Module Object)
    • 查找模块 / 包的路径,从sys.path中查找包
    • 执行其中的 __init__.py 代码,将该包内的__init__.py模块(python文件)构建模块对象,把 __init__.py 中定义的变量、导入的对象作为__init__.py模块对象的属性(__dict__字典中)

三、类对象与实例对象:属性的分层存储

类和实例对象是 Python 面向对象的核心,二者的属性存储遵循 “分层管理” 原则,核心载体仍是__dict__字典(堆区存储)。

  1. 类对象:方法与类属性的 “仓库”
  • 存储逻辑:类对象(如class Person:定义的Person)作为模块对象的属性存在,其__dict__存储:
    • 类属性(如species = “Human”);
    • 方法(本质是函数对象,如say_hello);
  • 继承特性:类属性查找会逐层向上遍历父类的__dict__(如Person继承object,会查找object.dict)。
  1. 实例对象:独有属性的 “专属空间”
    • 存储逻辑:实例(如p = Person())存在堆区,每个实例有独立的__dict__,仅存储实例独有属性(如self.name);
    • 属性查找优先级:实例访问属性时,先查自身__dict__ → 查类对象__dict__ → 查父类__dict__ → 抛出AttributeError

  • sys.module 是堆区的一块缓冲区,是个字典,存储所有module对象,key是模块名、value是module对象的引用地址
  • 每一个module对象也是通过__dict__ 字典存储着该模块的所有全局变量、类对象、实例对象,key: 属性名(类名、对象名、方法名),value:类、对象、方法的引用地址
  • sys.modules 本身是堆区的字典对象,地址固定;类对象、实例对象、模块对象的__dict__也是通过起始地址的固定偏移量计算出来的。
  • 编译完模块文件后,先在堆区分配地址,创建存储当前模块的模块对象,初始化其核心属性(dict, file,name),然后将创建的当前模块对象地址存储到 sys.module 字典缓冲区中,然后解释器会将当前模块地址存储到一个全局的 “模块上下文” (模块执行帧,非栈帧),这个模块上下文会贯穿程序执行的始终,程序会实时从这个模块执行帧中拿到最近的模块对象地址。

四、Python 内存管理的核心原则

  1. 引用为王:Python 中所有变量赋值、属性存储都是 “引用传递”(存地址),而非 “值传递”(存数据);
  2. 垃圾回收:堆区对象的生命周期由 “引用计数” 主导(计数为 0 则回收),分代回收补充处理循环引用;
  3. 分层查找:属性访问遵循 “实例→类→父类” 的优先级,模块对象的__dict__是全局命名空间的核心;
  4. 缓存优化:小整数(-5~256)、短字符串等常驻 “只读数据区”(堆区子集),全局共享避免重复创建。

五、总结

Python 的内存模型可概括为 “两区域、三对象、一核心”:

  • 两区域:栈帧区存引用,堆区存所有对象;
  • 三对象:模块对象管理文件级内容,类对象管理方法和类属性,实例对象管理独有属性;
  • 一核心:所有对象的属性都基于__dict__字典(或优化数组)存储,核心逻辑是 “引用 + 分层查找”。

到此这篇关于Python的底层内存模型之模块、类、对象的存储与运行机制的文章就介绍到这了,更多相关python内存模型存储与运行机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用 Python 解析配置文件格式

    使用 Python 解析配置文件格式

    选择配置格式是一种微妙的权衡。但是,一旦你做出决定,Python 就可以使用少量代码来解析大多数流行的格式。今天通过本文给大家分享 Python 解析配置文件格式的问题,感兴趣的朋友一起看看吧
    2021-07-07
  • 用Python将动态GIF图片倒放播放的方法

    用Python将动态GIF图片倒放播放的方法

    GIF(Graphics Interchange Format) 是一种可以用来呈现动画效果的图片格式,原理就是保存很多帧(Frame)静态图像,然后连续呈现。这篇文章主要介绍了用Python将动态GIF图片倒放播放的方法,需要的朋友可以参考下
    2016-11-11
  • Python调用百度api实现语音识别详解

    Python调用百度api实现语音识别详解

    这篇文章主要介绍了Python通过调用百度api实现语音识别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2021-12-12
  • Python标准库uuid模块(生成唯一标识)详解

    Python标准库uuid模块(生成唯一标识)详解

    uuid通过Python标准库的uuid模块生成通用唯一ID(或“UUID”)的一种快速简便的方法,下面这篇文章主要给大家介绍了关于Python标准库uuid模块(生成唯一标识) 的相关资料,需要的朋友可以参考下
    2022-05-05
  • python二维码操作:对QRCode和MyQR入门详解

    python二维码操作:对QRCode和MyQR入门详解

    今天小编就为大家分享一篇python二维码操作:对QRCode和MyQR入门详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 基于Python绘制三种不同的中国结

    基于Python绘制三种不同的中国结

    马上就要迎来新年了,就绘制了几个中国结,嘿嘿!本文为大家整理了三个绘制中国结的方法,文中的示例代码讲解详细,快跟随小编一起动手尝试一下吧
    2023-01-01
  • Python深度学习albumentations数据增强库

    Python深度学习albumentations数据增强库

    下面开始albumenations的正式介绍,在这里我强烈建议英语基础还好的读者去官方网站跟着教程一步步学习,而这里的内容主要是我自己的一个总结以及方便英语能力较弱的读者学习
    2021-09-09
  • python高并发异步服务器核心库forkcore使用方法

    python高并发异步服务器核心库forkcore使用方法

    这篇文章主要介绍了python高并发异步服务器核心库forkcore的使用方法,大家参考使用吧
    2013-11-11
  • python标识符命名规范原理解析

    python标识符命名规范原理解析

    这篇文章主要介绍了python标识符命名规范原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 详解如何利用Cython为Python代码加速

    详解如何利用Cython为Python代码加速

    这篇文章主要介绍了详解如何利用Cython为Python代码加速,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01

最新评论