Python源码剖析笔记-Python对象初探

以前看过一部分了,现在拿起来重新看。不准备像作者一样一步一步的修改代码测试验证,我只是懂得机理,知道是个什么东西就行,作者叙述的内容已经经过验证不会有什么错误。代码我也是下载的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'>

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply