Python对象初探
数据结构
PyObject_HEAD //对象公共头部
Py_ssize_t ob_refcnt; //对象引用数
PyTypeObject *ob_type; //对象类型
PyObject_VAR_HEAD //这个就是属于可变对象头部啦
PyObject_HEAD //对象头部
Py_ssize_t ob_size;//元素个数
展开了就是
PyObject_VAR_HEAD = {
Py_ssize_t ob_refcnt; //对象引用数
PyTypeObject *ob_type; //对象类型
Py_ssize_t ob_size;//元素个数
}
PyObject_HEAD_INIT(type) //不可变对象初始化
This is a macro which expands to initialization values for a new PyObject type. This macro expands to:
//头部初始化,对象引入数初始化为1,对象类型为传入来的类型对象
PyVarObject_HEAD_INIT(type, size)¶//可变对象初始化
This is a macro which expands to initialization values for a new PyVarObject type, including the ob_size field. This macro expands to:
//头部初始化,对象引入数初始化为1,对象类型为传入来的类型对象,大小为传进来的大小
而上面都有一个_PyObject_EXTRA_INIT
这个是因为系统定义了
Py_TRACE_REFS
所有要初始化 next和prev这两个指针
/* PyObject_HEAD defines the initial segment of every PyObject. */
#define PyObject_HEAD /
_PyObject_HEAD_EXTRA /
int
ob_refcnt; /
struct
_typeobject
*ob_type;
#define PyObject_VAR_HEAD /
PyObject_HEAD /
int
ob_size;
/* Number of items in variable part */
typedef
struct
{
PyObject_VAR_HEAD
}
PyVarObject;
char *tp_name; /* For printing, in format "<module>.<name>" */
int tp_basicsize, tp_itemsize; /* For allocation */
/* Methods to implement standard operations */
/* More standard operations (here for binary compatibility) */
在_typeobject的定义中包含了许多的信息,主要可以分为四类:
1.类型名,tp_name,主要是Python内部以及调试的时候使用;
2.创建该类型对象是分配内存空间的大小的信息,即tp_basicsize和tp_itemsize;
PyObject_HEAD_INIT(&PyType_Type)
PyObject_HEAD_INIT 这个宏定义如下这样的,
PyType_Type 这个的数据结构是这样的,其实我觉得它是PyTypeObject的一个实例
PyObject_HEAD_INIT(&PyType_Type)
sizeof(PyHeapTypeObject), /* tp_basicsize */
sizeof(PyMemberDef), /* tp_itemsize */
PyObject_GC_Del, /* tp_free */
(inquiry)type_is_gc, /* tp_is_gc */
[intobject.h]
typedef
struct
{
PyObject_HEAD
/* 这里宏展开就是
Py_ssize_t ob_refcnt; //对象引用数
PyTypeObject *ob_type; //对象类型
*/
long
ob_ival;
}
PyIntObject;
PyTypeObject
PyInt_Type
=
{
PyObject_HEAD_INIT(&PyType_Type)
/*
这里宏展开就是
1 //引用计数
&PyType_Type //类型对象
*/
0, //元素个数
"int",
sizeof(PyIntObject),
0,
(destructor)int_dealloc, /* tp_dealloc */
(printfunc)int_print, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
(cmpfunc)int_compare, /* tp_compare */
(reprfunc)int_repr, /* tp_repr */
&int_as_number, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
(hashfunc)int_hash, /* tp_hash */
0, /* tp_call */
(reprfunc)int_repr, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT
|
Py_TPFLAGS_CHECKTYPES
|
Py_TPFLAGS_BASETYPE, /* tp_flags */
int_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
int_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
int_new, /* tp_new */
(freefunc)int_free, /* tp_free */
};




浙公网安备 33010602011771号