Python源码剖析-上篇

Posted by 新宇 on January 1, 2020

整体架构与Python内建对象

一. Python总体架构

  1. 架构图

    Python整体架构

    • 文件组(File Groups)
      • 内建模块
      • 第三方库
      • 用户自定义模块
    • Python核心——解释器(interpreter)
      • Scanner词法分析:将每一行python源码切分成一个token
      • Parser语法分析:建立抽象树-AST
      • Compiler编译:根据AST生成指令集合——Python字节码
      • Code Evauator:执行字节码
    • 运行环境(Runtime Environment)
      • 对象/类型系统:包含Python各种内建对象,比如 整数,list 和 dict,以及用户自定义的类型和对象;
      • 内存分配器:负责对象内存的申请工作;
      • 运行时状态信息:维护了解释器再执行字节码时,不同状态之间的切换动作;
  2. Python源码的组织结构

    代码结构

二、Python内建对象

1.Python对象初探

  1. 在Python世界中,一切皆是对象
    • 整数、字符串等;
    • 类型,比如整数类型、字符串类型;
    • 类和对象都是Python内的对象创建的;
  2. 对象:对象时数据以及基于这些数据操作的集合(实际上是一片被分配的内存空间)
    • python中所有的内建类型对象都是被静态初始化的;
    • 一个对象一旦被创建,它在内存中的大小就是不变的(可变长度数据的对象只能在对象内部维护一个指向一可变的内存区域的指针)
  3. 变长对象与类型对象 - 在Python世界中,一切皆是对象, 这些内容在PyObject中定义(一个是引用计数,一个是类型信息) - Python本身是C语言写的

     // 定义宏信息
     #define _PyObject_HEAD_EXTRA 
         struct _object *_ob_next
         struct _object *_ob_prev
    
     #define PyObject_HEAD
         _PyObject_HEAD_EXTRA
         int ob_refcnt; 				 // 引用计数
         struct _typeobject *ob_type; // 类型信息
    
     // 定义PyObject
     typedef struct _object {
         PyObject_HEAD // 引用宏
     } PyObject
    
     // 定义PyIntObject
     typedef struct {
         PyObject_HEAD
         long ob_ival;
     }
    
     // PyObject_VAR_HEAD
     #define PyObject_VAR_HEAD
         PyObject_HEAD
         int ob_size; // 变长容器中容纳元素的个数
    
     // 定义PyVarObject
     typedef struct {
         PyObject_VAR_HEAD
     } PyVarObject
    

    • 类型对象 PyTypeObject

  4. 对象的创建
      1. 通过C的API创建,包括AOL和COL
      1. 通过类型对象创建,例如PyInt_Type,下图是int类型创建流程
  5. 对象的行为
    • PyNumberMethods ->支持数值对象的行为
    • PySequenceMethods ->支持序列对象的行为(list)
    • PyMappingMethods ->支持关联对象的行为(dict)
  6. 类型的类型
    • Python中一切皆对象
    • 类型也是对象,所有类型对象都是由 PyType_Type 派生的,所以又称为 metaclass
  7. 多态性
    • Python函数内部传递的引用都是一种范性指针——PyObject*
    • 该指针所指向的对象类型是不确定的,只能从所指对象的ob_type域动态判断
  8. 引用计数
    • Python通过一个对象的引用计数(ob_refcnt)的管理来维护对象在内存中的存在与否
    • ob_refcnt也决定着对象的创建与消亡
    • 当一个对象的引用计数减为0时候,该对象的析构函数(即生命周期结束时,对象的回收操作)会被调用
  9. Python对象的分类

2.Python中的整数对象