bobdu.cc

Follow me on GitHub

CPython实现源代码结构

源码 https://github.com/python/cpython
主要文件结构
cpython
├── Doc  Python文档
├── Grammar
├── Include  Python提供的所有头文件,编写C/C++扩展模块时需要用到
├── install-sh
├── Lib  Python语言编写的所有Python标准库
├── LICENSE
├── m4
├── Mac
├── Makefile.pre.in
├── Misc
├── Modules  所有使用C语言编写的模块
├── Objects  所有的Python内建对象
│   ├── listobject.c  列表对象
│   ├── longobject.c  int对象
│   ├── object.c  基础对象(所有对象都继承自object)
│   ├── tupleobject.c  元组对象
│   ├── unicodeobject.c  str对象
│   ├── ... 其他内建对象 命名形如listobject.c / tupleobject.c
├── Parser  Python解释器中的Scanner(词法分析)和Parser(语法分析)部分
├── PC
├── PCbuild  Visual Studio工程文件
├── Programs
├── pyconfig.h.in
├── Python  Python解释器中的Compiler(编译器)和执行引擎部分核心
├── README.rst
├── setup.py
└── Tools

Python中的对象

cpython/Include/object.h
#define _PyObject_HEAD_EXTRA            \
    struct _object *_ob_next;           \
    struct _object *_ob_prev;

typedef struct _object {
    _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;  // 对象引用计数值
    struct _typeobject *ob_type;  // 对象类型
} PyObject;

typedef struct _typeobject {
    ...
} PyTypeObject;

对象 是数据以及基于这些数据的操作的集合

实际上 是一片被分配的内存空间 这片内存空间在更高层次上是一个整体

Python对象就是C中的结构体 在系统堆上申请的一块内存


Python对象的多态性

Python使用PyObject * 变量来保存与维护所有的对象

Python内部各个函数之间传递的都是一种泛型指针 PyObject *

指针所指的对象是什么类型的只能通过所指对象的ob_type域来动态的判断

通过这个域 Python实现了多态


Python定长对象和变长对象

cpython/Include/object.h
typedef struct {
    PyObject ob_base;
    Py_ssize_t ob_size; /* Number of items in variable part */
                        // 定义了所容纳的元素的个数
} PyVarObject;