Python源码阅读:对象

py一切皆对象的实现

Python中对象分为两类: 定长(int等), 非定长(list/dict等)

所有对象都有一些相同的东西, 源码中定义为PyObjectPyVarObject, 两个定义都有一个共同的头部定义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、代码关系

 

 

 

 

posted @ 2018-09-18 15:57  千夜恋歌  阅读(195)  评论(0编辑  收藏  举报