譯者序
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()
當我們想要讓你特別關注