PYTHON 源码之基本对象(int string list dict)(一)

本系列讲解python的c语言源码大致结构,基于python2.7,共勉。
python的C语言实现,即CPython。
c语言的基础知识就不介绍了,但有两个重点是需要指出的,结构和指针,这两个东东一定要搞懂。
int string list dict等数据类型其本质都是一种结构(struct)的实例。这个结构有一个统一的头:

#define PyObject_HEAD    \
          int  ob_refcnt;  \                //引用计数
          struct _typeobject *ob_type;      // 类型

注意换行符,这里定义了一个python对象的头,所有python对象,他的头都是这样的两句话。比如python的int即PyIntObiect,他是这样定义的:

typedef struct {
     PyObject_HEAD
     long ob_ival;   // int的值
}PyIntObject;

展开,就是:

typedef struct {
     int ob_refcnt;
     struct _typeobject *ob_type;
     long ob_ival;   // int的值
}PyIntObject;

这样,python的int,本质上是一个结构体的类型,这个结构体是按照python的规矩来的,就是在头部加上了统一的东东,那么最简单的python内部对象是什么呢?相信大家已经猜到了。

typedef struct _object {
      int  ob_refcnt;             //引用计数
      struct _typeobject *ob_type; 
} PyObject;

有了这个,就相当于抓住了python对象的牛鼻子,想想怎m抓?
各位大神,其实,还有一个秘密武器没有做说明,就是“struct _typeobject *ob_type; ”
这个就是python对象的操作函数集合,比如int,有加减乘除和print吧,这些个操作是一个个小函数,统一放在一个类型为_typeobject的结构体中,这个结构体类型大概定义如下:

typedef struct _typeobject{
      int  ob_refcnt;             //引用计数
      struct _typeobject *ob_type; 
      int ob_size;
      char *tp_name;    //这个类型的名称
      数值操作函数。。。
      序列化(list)函数。。。
     关联操作函数。。。。
}PyTypeObject;

呵呵,说白了,_typeobject就是一些个函数的罗列,各种函数都在那里留了空,往里面填不同的函数,就形成了不同类型对象。还是以int为例,数值操作函数是要填进去的(add、sub、、、),还有tp_name = "int"。此时,变有了PyInt_Type。

所以“struct _typeobject *ob_type; ”可以理解为类型的具体操作表。
现在,回过头来,我们知道牛鼻子在哪里了。

PYTHON 源码之基本对象(int string list dict)(一)_第1张图片
pyton内部int的指针路线图.png

c语言中一个int在64位操作系统下之占用8个字节,但是python内部的int则是一个数据结构,体积一下子就增加了不少,如果总是新建删除,内存频繁的申请和释放,时间的开支很不划算,基本思路就是,在内存中开辟不同的区域,分别存放各种备用对象。

int对象的内存模型是个很有趣的例子,诸君勿急,且听下回分解。

你可能感兴趣的:(PYTHON 源码之基本对象(int string list dict)(一))