- reference: Python 源码剖析
- Python_object
- PyObject 定义
- 定长对象和变长对象
- 类型对象
- 对象的创建
- 对象的行为
- 类型的类型
- Python对象的多态性
- 引用计数
- Python对象的分类
1. 对象机制的基石 – PyObject
a.PyObject 定义
1 | [object.h] |
每一个python对象除了PyObject这部分必要信息,还有其他,比如PyIntObject
1 | [intobject.h] |
b.定长对象和变长对象
如何实现字符串?1
2
3
4
5
6
7
8[object.h]
PyObject_HEAD
int ob_size; /*Number of items in variable part*/
typedef struct{
PyObject_VAR_HEAD
} PyVarObject;
c.类型对象
- 类型对象 _typeobject
- 其中主要包含四类信息
- 类型名 tp_name
- 创建该类型对象时分配的内存空间大小的信息 tp_basicsize和tp_itemsize
- 与该类型对象相关联的操作信息
- 其他类型信息
1 | [object.h] |
d.对象的创建
- Python内部创建
- 通过Python C API
- 范型的API(AOL, Abstract Object Layer) 比如:PyObject* intObj = PyObject_New(PyObject, &PyInt_Type)
- 类型相关的API(COL, Concrete Object Layer) 比如: PyObject *intObj = PyInt_FromLong(10);
- 通过类型对象PyInt_Type
- 通过Python C API
e.对象的行为
- 函数指针直接决定这一个对象在运行时所表现出的行为
比如
数值特性(PyNumberMethods *tp_as_number)
序列特性(PySequenceMethods *tp_as_sequence)
关联特性(PyMappingMethods *tp_as_mapping)
1 | [object.h] |
特性的混合
1 | class MyInt(int): |
f.类型的类型
- PyType_Type =>
它是所有class的class,被称为metaclass
1 | [typeobject.c] |
PyTypeObject和PyType_Type的关系
1 | >> class A(object): |
举例
PyInt_Type和PyType_Type之间的关系
1 | [intobject.c] |
运行时整数对象及其类型之间的关系
g.Python对象的多态性
通过ob_type域动态进行判断,Python实现了多态机制
1 | void Print(PyObject *object){ |
h.引用计数
ob_refcnt 变量,32位整型,决定着对象的创建与消亡
通过Py_INCREF(op) 和 PyDECREF(op) 两个宏来增加和减少一个对象的引用计数
通过_Py_NewReference(op)宏来将对象的引用计数初始化为1
PyDECREF 的“析构动作” 是通过一个函数指针tp_dealloc来进行的(Observer设计模式)
在Python的各种对象中, 类型对象永远不会被析构
1 | [object.h] |