Python源码阅读:对象
py一切皆对象的实现
Python中对象分为两类: 定长(int等), 非定长(list/dict等)
所有对象都有一些相同的东西, 源码中定义为PyObject
和PyVarObject
, 两个定义都有一个共同的头部定义PyObject_HEAD
(其实PyVarObject有自己的头部定义PyObject_VAR_HEAD
, 但其实际上用的也是PyObject_HEAD
).
源码位置: Include/object.h
1、PyObject_HEAD
在Python内部, 每个对象拥有相同的头部.其C语言定义为:
1 /* PyObject_HEAD defines the initial segment of every PyObject. */ 2 #define PyObject_HEAD 3 _PyObject_HEAD_EXTRA 4 Py_ssize_t ob_refcnt; 5 struct _typeobject *ob_type;
说明:
1. _PyObject_HEAD_EXTRA 先忽略, 双向链表结构, 后面垃圾回收再说 2. Py_ssize_t ob_refcnt Py_ssize_t在编译时确定, 整型 ob_refcnt, 引用计数, 跟Python的内存管理机制相关(基于引用计数的垃圾回收) 3. struct _typeobject *ob_type *ob_type 指向类型对象的指针(指向_typeobject结构体) 决定了这个对象的类型!
2、PyObject
其定义为:
1 typedef struct _object { 2 PyObject_HEAD 3 } PyObject;
其依赖关系为:PyObject -> PyObject_HEAD,即如下结构:
3、PyVarObject
其定义为:
1 typedef struct { 2 PyObject_VAR_HEAD 3 } PyVarObject; 4 5 #define PyObject_VAR_HEAD 6 PyObject_HEAD 7 Py_ssize_t ob_size; /* Number of items in variable part */
依赖关系为:
1. 依赖关系 PyVarObject -> PyObject_VAR_HEAD -> PyObject_HEAD 2.Py_ssize_t ob_size ob_size, 变长对象容纳的元素个数
即如下结构:
4、代码关系