基本信息
编辑推荐
◆一本深入剖析Python具体实现的著作.
◆内容新鲜,采用最新的Python语言版本(2.5)
◆大量的图表形象地展示Python内部的运作机理..
◆在原理介绍的同时,带领读者一起动手对Python虚拟机进行改造
◆完整覆盖Python所有的核心议题,深刻揭示Python与C/C++之间如何互动
◆哲思自由软件社区倾力审校...
内容简介
计算机书籍
作为主流的动态语言,Python不仅简单易学、移植性好,而且拥有强大丰富的库的支持。此外,Python强大的可扩展性,让开发人员既可以非常容易地利用C/C++编写Python的扩展模块,还能将Python嵌入到C/C++程序中,为自己的系统添加动态扩展和动态编程的能力。
为了更好地利用Python语言,无论是使用Python语言本身,还是将Python与C/C++交互使用,深刻理解Python的运行原理都是非常重要的。本书以CPython为研究对象,在C代码一级,深入细致地剖析了Python的实现。书中不仅包括了对大量Python内置对象的剖析,更将大量的篇幅用于对Python虚拟机及Python高级特性的剖析。通过此书,读者能够透彻地理解Python中的一般表达式、控制结构、异常机制、类机制、多线程机制、模块的动态加载机制、内存管理机制等核心技术的运行原理,同时,本书所揭示的动态语言的核心技术对于理解其他动态语言,如Javascript、Ruby等也有较大的参考价值。
本书适合于Python程序员、动态语言爱好者、C程序员阅读。
作译者
目录
0.1 PYTHON总体架构
0.2 PYTHON源代码的组织
0.3 WINDOWS环境下编译PYTHON
0.4 UNIX/LINUX环境下编译PYTHON
0.5 修改PYTHON源代码
0.6 通往PYTHON之路
0.7 一些注意事项
第1部分 PYTHON内建对象
第1章 PYTHON对象初探
1.1 PYTHON内的对象
1.1.1 对象机制的基石——PyObject
1.1.2 定长对象和变长对象
1.2 类型对象
1.2.1 对象的创建
1.2.2 对象的行为
1.2.3 类型的类型
1.3 PYTHON对象的多态性
1.4 引用计数
1.5 PYTHON对象的分类
前言
C++的复杂性是个仁者见仁,智者见智的话题,但其实回到文本处理这个话题上来说,C++的STL在很大程度上已经足够好用了。文本处理不是服务器,所以不需要考虑自己管理内存,不需要考虑这个模式那个模式,STL提供了足够多的工具,简单组装一下就可以用了。
但俗话说得好,“不怕不识货,就怕货比货”,当我开始尝试用Python来进行日常的工作之后,突然发现C++太复杂了。对于Python,我的感觉只有四个字:摧枯拉朽。我只需要简单地写一个l = [ ],再也不用写诸如list< map<string, string> > l = list< map<string, string> >()这样折磨人眼的东西了,这使得代码量急剧减少。对于采用Python这样的英明决策,我想,最满意的就是我的手指头了。
随着对Python的逐渐熟悉,我越来越惊叹于Python简洁的表达,强大的功能。尤其是Python表现出来的强烈的动态性。比如下面这段与解释器的交互过程:
>>> class A:
... pass
...
>>> a = A()
>>> a.show()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute 'show'
>>>
>>> class B:
... def show(self):
... print 'i am B'
...
>>> A.__bases__ = (B,)
>>> a.show()
i am B
序言
让我们做得更好.
Python,我想已经不再是个陌生的词了,越来越多的人开始学习它,使用它,宣传它,甚至用它找到了工作。如果你了解Python,那么我想问一下,你对它有多了解呢?它是一种什么语言?如何实现的?有哪些对象,它们是如何处理的?你了解Python的虚拟机吗?了解它的运行环境吗?其实作为初学者或只是使用者,你的确不必了解这么多细节的内容,但是探究事物的原理,分析底层细节却也是许多人成为高手、“老鸟”的原因,因为你知道别人不知道的东西,掌握了别人不了解的技术,这些内容使得你的见解、分析,甚至作品都可能超过别人。那么本书就向你提供了一个了解Python底层细节的机会,你可以沿着作者的思路和角度去体会Python的工作原理和底层的细节,一点一点地了解Python源码的精妙之处,有助于更好地掌握Python并编写出高质量的程序。
本书的内容深入到Python的方方面面,像Python的对象实现机制是如何用C来表现的;对象的特性是如何实现的;对象是如何管理的;不同对象,如int、str、dict、list等的处理;Python的虚拟机框架、作用域的实现;运行时环境,pyc文件,类机制等。还有一些高级话题,如内存管理,GIL(Global Interpreter Lock)与多线程,模块动态加载等。
在接触到本书之前,我已经在作者的Blog上见到过部分内容,那时已经被作者不懈的毅力和深厚的功力折服。说实话,由于经常接触Python,对于原本熟悉的C语言也越来越陌生,更不要说去“啃”Python的C代码了。而Robert Chen可以从源码中进行有条理的分析和整理,并终于出版此书。这不仅让人敬佩,更让广大的Python爱好者受益多多。因此,当出版社希望我为本书作一个推荐序时,我毫不犹豫地答应下来。
第一次见到Robert Chen还是在CPUG的一次会课上,那时Robert Chen给大家带来一个主题为“Python作用域与名字空间”的讲座,让在座的Pythoner对Python的作用域机制有了更深入的理解,讲座效果非常好,讨论也很热烈。他从源码的角度讲述了Python的一些规则,使得大家的理解不再停留在形式上或规则上,而达到了本质或实现的层次,让我们“知其然,更知其所以然”。
如果你是一位热心的Pythoner,想必会知道中文Python的邮件列表(http://groups. google.com/group/python-cn),从上面对有些问题的回复中,你会发现Robert Chen总是从源码及字节码实现的角度来回答问题,非常有说服力。因此当许多Python爱好者得知Robert Chen将出版此书时,都非常盼望,现在这本书终于出版,大家都深感庆幸!
本书不仅仅是高水平、高质量的一本书,纵观国内外与Python相关的书籍,它也是第一本从源码角度写作的书,所以意义非常。目前国内原创的Python书籍还不多,就我所知国内已经出版的几本Python方面的书尚不能满足读者需求,而本书应该不会让你失望。
不过本书应该不是面向初学者的书,因为它涉及了许多较深的内容和知识,建议读者应先掌握像C语言、数据结构、操作系统、编译原理等方面的基础知识,并且具备一定的编程经验,才能更好地理解书的内容。
再次感谢Robert Chen带给大家的这份礼物!
李迎辉
limodou@gmail.com
2008年春
推荐序二
真的难以想象,Python语言和社区能够发展得如此迅速。在我第一次使用Python完成我的项目时,它还不过是一个刚刚在开源社区中起步的新生儿,然后在各方面迅速推广,4月8日,google发布的App Engine更是让所有的开发人员眼中一亮。相信今后会有更多的开发人员投入到Python的技术领域中来。
记得在2002年时,我使用Python写了一套大规模的消息系统,几位同事分别使用Python、Java和C完成了一个异步二进制消息流的客户端和服务器。通过一系列测试,大家惊奇地发现Python以每秒一倍的数据处理量超过了C写的代码。后来,我的同事细心地查看了Python的源代码,发现了几种完全不同的操作系统调用方法,以及为提高性能而使用的技巧。这也是我第一次开始查看Python的源代码。最近的一次则是我在xBayTable中使用asyncore时,通过阅读asyncore的源代码排除了一个痛苦bug,轻松地找到了问题的根源,很快就换了一种解决方案来继续我的工作。了解Python的源代码,我们能获得很多的好处:
使用Python方法提高自己的代码性能和功能;..
快速地与文档结合,解决问题或是找出方法;
扩展Python。
书摘
对象是Python中最核心的一个概念,在Python的世界中,一切都是对象,一个整数是一个对象,一个字符串也是一个对象。更为奇妙的是,类型也是一种对象,整数类型是一个对象,字符串类型也是一个对象。换句话说,面向对象理论中的“类”和“对象”这两个概念在Python中都是通过Python内的对象来实现的。
在Python中,已经预先定义了一些类型对象,比如int类型、string类型、dict类型等,这些我们称之为内建类型对象。这些类型对象实现了面向对象中“类”的概念;这些内建类型对象通过“实例化”,可以创建内建类型对象的实例对象,比如int对象、string对象、dict对象。类似的,这些实例对象可以视为面向对象理论中“对象”这个概念在Python中的体现。
同时,Python还允许程序员通过class A(object)这样的表达式自己定义类型对象。基于这些类型对象,同样可以进行“实例化”的操作,创建的对象称为“实例对象”。Python中不光有着这些千差万别的对象,这些对象之间还存在着各种复杂的关系,从而构成了我们称之为“类型系统”或“对象体系”的东西。
Python中的对象体系是一个庞大而复杂的体系,如果说在本书的第一章我就试图将这个体系阐释清楚,这只能说明我是个疯子。在本章中,我们的重点将放在了解对象在Python内部是如何表示的,更确切地说,因为Python是由C实现的,所以我们首先要弄清楚的一个问题就是:对象,这个神奇的东西,在C的层面,究竟长得是个什么模样,究竟是三头六臂,还是烈焰红唇。
除此之外,我们还将了解到类型对象在C的层面是如何实现的,并初步认识类型对象的作用及它与实例对象的关系。总之,本章对Python对象体系的介绍力求简洁,但是并不肤浅,有的地方甚至会相当深入。因此,在本章的阅读中,如果有什么疑难的地方,没有关系,先放下,只要有一个直观的感觉就可以了,这并不妨碍你阅读接下来的内容。
本章的目的是为能够顺利而快速地进入对内建对象的剖析打下必要的基础,至于对Python对象体系的详细剖析,会在第2部分的最后一章中介绍到。只有到了那个时候,我们才有足够的能力将这个体系看个明白。
1.1 Python内的对象
从1989年Guido在圣诞节揭开Python的大幕开始,一直到现在,Python经历了一次一次的升级,但是其实现语言一直都是ANSI C。我们知道,C并不是一个面向对象的语言,那么在Python中,它的对象机制是如何实现的呢?
对于人的思维来说,对象是一个比较形象的概念,而对于计算机来说,对象却是一个抽象的概念。它并不能理解这是一个整数,那是一个字符串,对于计算机来说,它所知道的一切都是字节。通常的说法是,对象是数据以及基于这些数据的操作的集合。在计算机中,一个对象实际上就是一片被分配的内存空间,这些内存可能是连续的,也可能是离散的,这都不重要,重要的是这片内存在更高的层次上可以作为一个整体来考虑,这个整体就是一个对象。在这片内存中,存储着一系列的数据以及可以对这些数据进行修改或读取操作的一系列代码。
在Python中,对象就是为C中的结构体在堆上申请的一块内存,一般来说,对象是不能被静态初始化的,并且也不能在栈空间上生存。唯一的例外就是类型对象,Python中所有的内建的类型对象(如整数类型对象,字符串类型对象)都是被静态初始化的。
在Python中,一个对象一旦被创建,它在内存中的大小就是不变的了。这就意味着那些需要容纳可变长度数据的对象只能在对象内维护一个指向一块可变大小的内存区域的指针。为什么要设定这样一条特殊的规则呢,因为遵循这样的规则可以使通过指针维护对象的工作变得非常的简单。一旦允许对象的大小可在运行期改变,我们就可以考虑如下的情形。在内存中有对象A,并且其后紧跟着对象B。如果运行期某个时刻,A的大小增大了,这意味着必须将A整个移动到内存中的其他位置,否则A增大的部分将覆盖原本属于B的数据。只要将A移动到内存中的其他位置,那么所有指向A的指针就必须立即得到更新,光是想一想,就知道这样的工作是多么的繁琐。
……