基类和元类型
在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; //变长对象的头