四时宝库

程序员的知识宝库

CPython源码阅读3-基类与元类型-变长与定长对象

基类和元类型

在Python源码中,数据类型都是以类型来表示的,称作类型对象。一个整形,浮点型,字符串,序列,元组,字典都是一个对象。比如说,一个int(类型) 是一个类型对象,类型int实例化之后生成对象(int (8))是一个实例对象。在这个对象体系中,既然都是对象,一定需要一个基类,其余类继承这个基类。就可能存在一个类型对象的元类型(type),一个实例对象的基类(object)。还需要某种关系把类型对象和实例对象联系起来。如图1 基类和元类型。


变长对象与定长对象

我们可以感觉到,在python中,用一个整形变量无需知道整数的范围,例 a= 8; a = 600000都可以,不会溢出。说明变长对象内部除了存储数值内容之外,需要存储一个头来表示这些信息。从图2 可以看出定长对象的头部缺少一个字段ob_size。


实际代码看一下,定长对象和变长对象的头。

typedef struct _object {

Py_ssize_t ob_refcnt;

PyTypeObject *ob_type;

} PyObject; //定长对象头

typedef struct {

PyObject ob_base;

Py_ssize_t ob_size; /* Number of items in variable part */

} PyVarObject; //变长对象的头

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接