python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python内存模型存储与运行机制

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

作者:勇往直前plus

这篇文章介绍了Python的底层内存模型之模块、类、对象的存储与运行机制,从内存布局、对象存储、属性管理三个核心维度,总结汇总 Python 的底层内存模型和运行机制,感兴趣的朋友跟随小编一起看看吧

前言

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

一、先编译,后解释

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

源代码(.py) → 编译生成字节码(.pyc) → Python虚拟机(PVM)解释执行字节码 → 与操作系统交互

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

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

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

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

  1. 模块对象的核心特性
  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. 类对象:方法与类属性的 “仓库”
  1. 实例对象:独有属性的 “专属空间”
    • 存储逻辑:实例(如p = Person())存在堆区,每个实例有独立的__dict__,仅存储实例独有属性(如self.name);
    • 属性查找优先级:实例访问属性时,先查自身__dict__ → 查类对象__dict__ → 查父类__dict__ → 抛出AttributeError

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

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

五、总结

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

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

您可能感兴趣的文章:
阅读全文