所有类的基础
定长对象
PyObject
#define PyObject_HEAD \
_PyObject_HEAD_EXTRA \
Py_ssize_t ob_refcnt; \
struct _typeobject *ob_type;
// 定长对象
typedef struct _object {
PyObject_HEAD
} PyObject;
变长对象
PyVarObject
#define PyObject_VAR_HEAD \
PyObject_HEAD \
Py_ssize_t ob_size; /* Number of items in variable part *///即 容器中元素的个数
//变长对象(例如list等,多为容器)
typedef struct {
PyObject_VAR_HEAD
} PyVarObject;
效果
通过这样定义,所有的对象都具备这样的元素,
那么,在对象的内存布局的头部便都具有了相同的信息头
那么,我们便可以使用一个PyObject*
指针来引用所有的对象
类型对象
当然生成一个对象需要知道类的长度等信息
这就需要用到一个类的对象PyTypeObject
对象的创建
一般,python提供了两种方式来创建对象
- 通过Python C API来创建
- 通过类型对象创建(例如创建int对象使用的
PyInt_Type
)
Python C API 可以分为两类
- 泛型的API (AOL Abstract Object Layer)
这类API可以应用到所有Python对象上,一般以PyObject_***
的形式存在 - 类型相关的API (COL Concrete Object Layer)
这类API只能作用于特定的类型,例如PyInt_FromeLong()
参考
《Python 源码剖析》