很久以前就开始有了学习python的打算,在看了黑客与画家又搞定了实习以后,还是决定静下心来琢磨琢磨它了,看了“python学习手册”整了点基础知识,还是打算从python的底层实现学习,同时也可复习复习编译原理和C,,在官网python.org下载份源码,下了2.7的,因为看介绍说3.0和2.0的功能上有一些比较明显的差别,比如说类继承树的查找方式,一些运算的处理,还是决定整2.7的版本,在下载的源码中有一个PCbuild目录,里面有vs的工程文件,在vs中导入工程就可以编译了,后续研究的时候可以通过修改其中相关的代码来观察效果,具体的配置过程可参考网上教程。
从每个属性对应的注释大概可以知道它们的作用,需要理解的几个属性是, PyVarObject_HEAD_INIT(&PyType_Type, 0),这个说明作为int的类型对象其也是有类型的……这听起来有点拗口,好吧=。=!其实就是因为在python底层的实现中需要判断一个对象的类型属于哪一类,是int还是string,还是啥啥!好吧,我也被绕进去了……算了就这样吧!!!紧接着就是int对象类型的名字,后面有一个 int_as_number,这是一个方法数组,其中定义了在int类型上可以进行的操作,像加减乘除这些,当你在python执行了对应的操作时,就会调用这里的函数完成功能。紧跟着这个参数的还有定义与序列和字典的操作集, PyTypeObject结构的定义在object.h中,可具体参照。
在python中可以说一切都是对象,最基本的是PyObject,在object.h中可以看到这些基本数据结构的定义,
#define PyObject_HEAD \
_PyObject_HEAD_EXTRA \
Py_ssize_t ob_refcnt; \
struct _typeobject *ob_type;
typedef struct _object {
PyObject_HEAD
} PyObject;
PyObject可以说是所有其它对象类型的根对象,其中的ob_refcnt存储对象的引用次数,而ob_type则存储对象的类型,引用次数涉及了python的垃圾回收机制,跟java一样,当引用次数为0时,则回收对象的内存空间。至于ob_type的作用,我们知道在python中,变量是没有类型的,变量引用的对象才有类型,比如b=3;这里b是变量,其中没有类型信息,类型信息在其其对应的int对象——3中,这跟以前对java,c,c++等语言认知不太一样,在这些语言中变量具有其类型信息。这个特性也构成了python的多态机制的基础,变量中没有类型信息,所以可以给其任意赋值,知道运行时,python才确定其引用的对象类型。
从内置类型intobject可以看出一些端倪,PyIntObject为:
typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;
其类型对象:
PyTypeObject PyInt_Type = {
PyVarObject_HEAD_INIT(&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_to_decimal_string, /* 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_to_decimal_string, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS, /* 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 */
int_getset, /* 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 */
};
从每个属性对应的注释大概可以知道它们的作用,需要理解的几个属性是, PyVarObject_HEAD_INIT(&PyType_Type, 0),这个说明作为int的类型对象其也是有类型的……这听起来有点拗口,好吧=。=!其实就是因为在python底层的实现中需要判断一个对象的类型属于哪一类,是int还是string,还是啥啥!好吧,我也被绕进去了……算了就这样吧!!!紧接着就是int对象类型的名字,后面有一个 int_as_number,这是一个方法数组,其中定义了在int类型上可以进行的操作,像加减乘除这些,当你在python执行了对应的操作时,就会调用这里的函数完成功能。紧跟着这个参数的还有定义与序列和字典的操作集, PyTypeObject结构的定义在object.h中,可具体参照。