声明:下面的知识很多都是网上搜索出来和自己研究出来,参考了源码剖析的东西,特别是图,自己又做了一下总结,并无侵权恶意。
1.python底层是由c语言发展而来,所以底层代码都是c编写,如果你下载了一份源码,你会发现底层底层是大量的c语言代码,不多说,说句名言:一切都是对象。
2.python的一切都是对象,那么这句话的根据是哪里来的呢,看c语言的底层实现:
PyObject是Python对象的核心,注意PyObject是c语言的结构体并且是下面这样的
typedef struct _object{
int ob_refcnt;
struct _typeobject *ob_type
}
上面就是c语言实现Python对象的所有的基本的结构体,这句话的意思就是python所有的对象开头在内存中都是这个结构体,那么其中的意思是:
ob_refcnt:python的引用计数回收机制中,计数就是这个变量实现的,有一个变量引用,这个对象的这个数值就会加1,如果这个数值为0,那么就会被回收器发现并释放(不是回收哦)是释放,存到free_list(这块后面说)中,等着别的申请使用。
struct _typeobject *ob_type:这个东西是对象类型的一个指针_typeobject 这个东西也是个结构体,里面记载了这个对象类型具体的信息,申请内存,操作啊什么的。
3.python有定长对象和变长对象的分别,比如整型就是定长对象,所有对象占用的内存大小是固定,而字符串就是变长对象,变长对象对字符串是不固定的,变长对象的实现就是对上面的这个基本结构体加上int ob_size,类似与下图:
typedef PyObject_VAR_Head{
Pyobject
int ob_size;
}
int ob_size:这个就是记录了变长的数据有多少个,比如list有5和元素,那么这个就是5.4.说一下每个对象都有相同的头的好处,就是第一个结构体_object 的好处,这样可以在c中用一个PyObject *就可以引用所有对象了,是不是坑坑的,叼叼的。
5.偷一张图,标识下关系--记录下:
6.创建对象时,底层的c是怎么知道分配多少内存的呢,这个就是前面说的第一个结构体中的对象类型表示的了,对象类型里面记录了创建对象的一些信息,就像下面这个一个
记录了类的名字啊、内存分配大小啊,操作啊什么的个性化的东西。
7.Python创建对象的方法,第一种是通过封装的C API,第二种是通过类型对象--这个理解起来有点坑,就是类型也是一种对象,这个类型类就是type,不然你可以试试 print int.__class__ 原来int类型的类型是type类型。。
8.c api又分为两种1、AOL 2、COL 这里很深了,小弟在研究中
9.python的对象分类是这样的,
10,心好累,先写到这里吧。