译者序
Python是一门多范式编程语言,这意味着你可以用它进行面向对象编程,也可以选择使用面向过程编程的方式,甚至可以尝试函数式编程。而Python最令人着迷之处在于,它拥有极大灵活性的同时,使用的是十分简单、优雅的语法,因此甚至被称为“可执行的伪代码”。本书主要围绕Python面向对象编程相关的概念与方法,同时也介绍了一些Python 3的新增功能、特性。众所周知,Python 3的升级、推广在Python开发者中一直存在较多争议,批判者的声音主要集中在其向后不兼容这一点。不过译者认为Python 3是非常值得开发者花时间去学习、升级的,Python 3中的字符串默认采用UTF-8编码,这无疑给中文环境的开发者带来了极大的便捷;此外,采用新的异步编程模型也使得Python在服务器开发领域更具竞争力。幸运的是,本书对于这几点都通过单独章节分别进行了详细介绍,无论读者是刚刚接触Python的初学者,还是打算将Python从之前的版本升级到最新的版本,本书都将很有帮助。
第2版序
我需要忏悔,在我写本书第1版的时候,我根本不知道自己在做什么。我认为我了解Python并且知道该怎么写。很快我就发现这是错的。幸运的是,通过本书的写作我已经完全适应了这两点。
我担心大家可能会不喜欢《Python 3 面向对象编程》这本书,所以我两年没有参加PyCon。直到收获了几十条正面的反馈,我才重获信心,终于参加了2012年在圣克拉拉举办的PyCon。我很快发现每个人都听说过我或我的书,完全是我庸人自扰!
书写完之后我也很怕重新阅读它。在收到诸多赞誉之前,它一直严实地放在我的书架上,直到我需要引用其中的内容回答读者的提问。在准备本书第2版的时候,我最终不得不面对我的心魔。令我惊喜和开心的是,我发现5年前自己所写的这本书既准确又令人愉快,一如很多读者的评价所提到的。
初次阅读之后不久,我收到了来自 Amazon 上的第一条负面评价。如果我在完成本书后立即看到这条评价,那将是毁灭性的。幸运的是,4年来的正面评价以及我自己对写作上的自信,让我可以忽略辛辣的批评并将剩下的部分作为建设性的反馈。事实上,读者提出的很多瑕疵都是本书最初出版时Python还未实现的特征。《Python 3面向对象编程》出版已经有些年头了,显然已经到了需要升级的时候。升级的结果现在已经在你手里(或在你的电子书阅读器上)。
我经常纳闷,为什么技术类书籍的作者要如此详细地描述不同版本书籍之间的区别。我的意思是,有多少人会在读了第1版之后还读第2版呢?就像软件的版本一样,你可以笃定最新的版本是最好的,但你不会真的想要关心它的历史。不过,这本书占据了我过去一年大部分的时间,所以我不得不提一下这本书已经变得多好了。
其实第1版组织得稍微有些混乱,很多章节结束之后直接跳到下一章,有几个关键位置上的主题之间存在跳跃,甚至更糟糕的是,彼此不相关。现在,讨论设计模式之前的2章被重新调整并分为3章,这样更加顺畅地切换到下一个主题。
我同时也彻底删除了关于Python 3第三方库的一整章内容。在Python 3和这本书都还是新鲜事物的时候,这一章的存在还算合理。只有几个库移植到Python 3,对它们进行详尽的讨论是合理的。不过,我没办法深入探讨这些主题的细节,坦白地说,针对每一个主题我都可以再写一整本书。
最后,我添加了全新的一章,关于并发的内容。关于这一章我纠结了一阵,现在可以坦白承认它与面向对象编程并没有直接的关系。然而,和单元测试那一章一样,我认为理解并发是所有语言中不可或缺的部分,特别是对于Python生态系统中的面向对象编程。当然,如果你不同意大可跳过这些章节(或者等你改变主意之后再来阅读它们)。
请尽情享受这本书以及你的面向对象编程之旅!
Dusty Phillips
前言
本书介绍了面向对象范式的相关术语,通过循序渐进的例子聚焦面向对象设计。本书介绍从简单且是面向对象编程工具箱中最有用的继承关系,到异常处理和设计模式的内容,以一种面向对象的方式来看待面向对象的概念。
在这一过程中,我们将会学习整合 Python 编程语言中面向对象和非面向对象的方面,学习操作文件和字符串的复杂性,并强调(正如Python 3 所做的)二进制和文本数据的区别。
我们将会发现单元测试的乐趣,会用到两个单元测试框架。最后,我们会探索Python众多的并发范式,学习如何让不同对象在同一时间一起运行。
本书包含哪些内容
本书可以粗略地分为4个主要部分。前4章我们将会深入探讨面向对象编程的准则以及Python是如何运用它们的。第5~8章我们将会通过学习这些准则是如何应用到Python内置函数中的,来探讨一些Python特有的应用。第9~11 章是关于设计模式的内容。最后两章探讨与Python编程相关同时可能很有趣的主题。
第1章,面向对象设计,介绍了重要的面向对象概念。主要关于一些相关术语,如抽象、类、封装、继承。我们也简单地介绍了用来建模类和对象的UML。
第2章,Python对象,讨论类和对象以及如何在Python中使用它们。我们将会学习Python对象的属性和行为,以及如何将类组织到包和模块中去。最后,我们将会学习如何保护我们的数据。
第3章,对象相似时,帮助我们更加深入地探讨继承关系。包括多重继承以及如何扩展内置类型。这一章也介绍了多态和鸭子类型在Python中是如何运作的。
第4章,异常捕获,介绍异常和异常处理。我们将会学习如何创建我们自己的异常,以及如何利用异常控制程序流程。
第5章,何时使用面向对象编程,介绍如何创建和使用对象。我们将会看到如何用属性封装数据以及限制数据的访问。这一章也讨论了DRY准则以及如何避免代码重复。
第6章,Python数据结构,介绍Python内置类的面向对象特征。我们将会学习元组、字典、列表以及集合,还有几个更高级的容器类型。我们也将学习如何扩展这些标准对象。
第7章,Python面向对象的捷径,正如标题所言,这一章介绍使用Python节省时间的方法。我们将会学习很多有用的内置函数,例如用默认参数实现方法重载。我们也将看到函数本身也是对象的特性以及如何利用这一特性。
第8章,字符串与序列化,介绍字符串、文件以及格式化。我们将会讨论字符串、字节以及字节数组之间的区别,还有将序列化文本、对象和二进制数据转化为几种规范表示的多种不同方式。
第9章,迭代器模式,介绍了设计模式的概念,以及迭代器模式的Python图形化实现。我们将会学习列表、集合以及字典的推导形式。我们也将理解生成器与协程。
第10章,Python设计模式I,介绍了几种设计模式,包括装饰器模式、观察者模式、策略模式、状态模式、单例模式以及模板模式。每一种设计模式都通过Python实现的相关的例子程序进行讨论。
第11章,Python设计模式II,专注讨论更多的设计模式,如适配器模式、门面模式、享元模式、命令模式、抽象模式以及组合模式。用更多的例子说明Python习惯用法与规范实现之间的区别。
第12章,测试面向对象程序,以介绍为何对Python应用进行测试如此重要为开始。强调测试驱动开发,并介绍两种不同的测试工具unittest和py.test。最后,讨论模拟测试对象和代码覆盖率相关内容。
第13章,并发,这一章是关于Python所支持(以及缺乏)的并发模式的速成教程。讨论了线程、多进程、Future以及新的AsyncIO库。
每一章都包含相关的例子和一个案例学习,案例学习会将本章内容整合到一个可运行的(可能不完整的)程序中。
学习本书你需要用到什么
本书中所有的例子都是基于Python 3解释器的。确保你用的不是Python 2.7或更早的版本。在写本书时,Python 3.4是最新的版本。大部分例子也可以在较早版本的Python 3中运行,但是为了最大限度地减少可能给你带来的失望情绪,最好用最新版本。
所有的例子都可以运行在任何支持Python的操作系统上。如果不能,请作为错误信息提交给我。
有些例子需要连接互联网。你可能会想要有一个这样的课外研究和调试。
除此之外,本书中有些例子依赖于不使用Python的第三方库。在用到它们的时候会进行介绍,因此你并不需要提前安装。但是为了保持完整性,下面列出会用到的所有库:
? pip
? requests
? pillow
? bitarray
本书的目标读者
本书尤其针对那些没有面向对象编程经验的人,同时也假设你已经拥有了基本的Python技能。你将会深入学习面向对象准则。对于将Python用作“胶水”语言并希望提升编程技巧的系统管理员来说,本书也特别有用。
如果你熟悉用其他语言进行面向对象编程,那么本书将会帮助你用符合Python语言习惯的方式将你的这些知识应用到Python生态系统中。
约定
本书使用不同的文本格式来区别不同的信息。下面是一些格式的例子,以及它们的含义。
文本中的代码、数据库表名、目录名、文件名、文件后缀名、路径名、URL、用户输入以及Twitter用户名以如下方式展示:“我们从字典中查询类,并存储到名为PropertyClass的变量中。”
一个代码块可以设定为如下所示的样式:
def add_property(self):
property_type = get_valid_input(
"What type of property? ",
("house", "apartment")).lower()
payment_type = get_valid_input(
"What payment type? ",
("purchase", "rental")).lower()
当我们想要让你特别关注