以前看过一部分了,现在拿起来重新看。不准备像作者一样一步一步的修改代码测试验证,我只是懂得机理,知道是个什么东西就行,作者叙述的内容已经经过验证不会有什么错误。代码我也是下载的python2.5版本的,对照着看看。
Python中,对象就是c中的结构体在堆上申请的一块内存,一般的,对象是不能被静态初始化的,并且也不能再栈空间上生存。唯一例外就是类型对象,内建类型对象(整数类型对象,字符串类型对象)都是静态初始化的。
PyObject
typedef struct _object {
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type
} PyObject
Py_ssize_t 作者说当作int看,书上就写的int。整型变量ob_refcnt实现了基于引用计数的垃圾收集机制。对于对象A,有新的PyObject *引用该对象,A的引用计数增加,当删除时,减少。当A的引用计数减少到0时,A从堆上删除,释放内存。
结构体_typeobject是对应一个对象类型的类型对象,描述类型信息。
PyIntObject
typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject
PyObject_HEAD就是_object中的成员,在整型对象中,long型变量ob_ival就是存储的整数的值。作者用这个例子说明,python的对象都是基于PyObject的,并且还有属于自己的对象信息。
PyVarObject
#define PyObject_VAR_HEAD \
PyObject_HEAD \
Py_ssize_t ob_size; /* Number of items in variable part */
typedef struct {
PyObject_VAR_HEAD
} PyVarObject
专为变长对象准备,整型的ob_size指明变长对象中容纳元素的个数,而不是字节数量。
PyTypeObject
typedef struct _typeobject {
PyObject_VAR_HEAD
const char *tp_name; /* For printing, in format "<module>.<name>" */
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
struct _typeobject *tp_base;
…
} PyTypeObject
类型对象,结构体好长,也看不懂,复制作者有介绍的几个。
tp_name 类型名。tp_basicsize创建该类型对象分配的内存空间大小信息, tp_itemsize一个元素在内存中的长度,对不定长度的对象使用。
结构体中另外两部分:与类型对象相关联的操作信息,和类型信息。
tp_base 指定基类,tp_new创建对象,tp_init 初始化对象。tp_hash生产hash值
类型对象的类型,
每一个对象都有一个类型,比如:a=10, type(a),返回<type 'int'>,说明对象a的类型为int。但是int为类型,也是一个PyTypeObject对象,他的类型是啥呢。type(int)测试,返回<type 'type'>。type(type),<type 'type'>
上一篇: 毕业设计题目
下一篇: python的几个内建函数
0 Responses so far.