在開始部分,請看官非常非常耐心地閱讀下面幾個枯燥的術語解釋,本來這不符合本教程的風格,但是,請看官諒解,因為列位將來一定要閱讀枯燥的東西的。這些枯燥的屬于解釋,均來自維基百科。
**1、問題空間**
> 問題空間是問題解決者對一個問題所達到的全部認識狀態,它是由問題解決者利用問題所包含的信息和已貯存的信息主動地構成的。
一個問題一般有下面三個方面來定義:
* 初始狀態——一開始時的不完全的信息或令人不滿意的狀況;
* 目標狀態——你希望獲得的信息或狀態;
* 操作——為了從初始狀態邁向目標狀態,你可能采取的步驟。
這三個部分加在一起定義了問題空間(problem space)。
**2、對象**
> 對象(object),臺灣譯作物件,是面向對象(Object Oriented)中的術語,既表示客觀世界問題空間(Namespace)中的某個具體的事物,又表示軟件系統解空間中的基本元素。
對象這個屬于,比較抽象。因此,有人認為,將object翻譯為“對象”,常常讓人迷茫,不如翻譯為“物件”更好。因為“物件”讓人感到一種具體的東西,而所謂對象,就是指那種具體的東西。
這種看法在某些語言中是非常適合的。但是,在Python中,則無所謂,不管怎樣,python中的一切都是對象,不管是字符串、函數、模塊還是類,都是對象。“萬物皆對象”。
都是對象有什么優勢嗎?太有了。這說明python天生就是OOP的。也說明,python中的所有東西,都能夠進行拼湊組合應用,因為對象就是可以拼湊組合應用的。
對于對象這個東西,OOP大師Grandy Booch的定義,應該是權威的,相關定義的內容包括:
* **對象**:一個對象有自己的狀態、行為和唯一的標識;所有相同類型的對象所具有的結構和行為在他們共同的類中被定義。
* **狀態(state)**:包括這個對象已有的屬性(通常是類里面已經定義好的)在加上對象具有的當前屬性值(這些屬性往往是動態的)
* **行為(behavior)**:是指一個對象如何影響外界及被外界影響,表現為對象自身狀態的改變和信息的傳遞。
* **標識(identity)**:是指一個對象所具有的區別于所有其它對象的屬性。(本質上指內存中所創建的對象的地址)
**3、面向對象**
> 面向對象程序設計(英語:Object-oriented programming,縮寫:OOP)是一種程序設計范型,同時也是一種程序開發的方法。對象指的是類的實例。它將對象作為程序的基本單元,將程序和數據封裝其中,以提高軟件的重用性、靈活性和擴展性。
>
> 面向對象程序設計可以看作一種在程序中包含各種獨立而又互相調用的對象的思想,這與傳統的思想剛好相反:傳統的程序設計主張將程序看作一系列函數的集合,或者直接就是一系列對電腦下達的指令。面向對象程序設計中的每一個對象都應該能夠接受數據、處理數據并將數據傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。
>
> 目前已經被證實的是,面向對象程序設計推廣了程序的靈活性和可維護性,并且在大型項目設計中廣為應用。 此外,支持者聲稱面向對象程序設計要比以往的做法更加便于學習,因為它能夠讓人們更簡單地設計并維護程序,使得程序更加便于分析、設計、理解。反對者在某些領域對此予以否認。
>
> 當我們提到面向對象的時候,它不僅指一種程序設計方法。它更多意義上是一種程序開發方式。在這一方面,我們必須了解更多關于面向對象系統分析和面向對象設計(Object Oriented Design,簡稱OOD)方面的知識。
下面再引用一段來自維基百科中關于OOP的歷史。
> 面向對象程序設計的雛形,早在1960年的Simula語言中即可發現,當時的程序設計領域正面臨著一種危機:在軟硬件環境逐漸復雜的情況下,軟件如何得到良好的維護?面向對象程序設計在某種程度上通過強調可重復性解決了這一問題。20世紀70年代的Smalltalk語言在面向對象方面堪稱經典——以至于30年后的今天依然將這一語言視為面向對象語言的基礎。
>
> 計算機科學中對象和實例概念的最早萌芽可以追溯到麻省理工學院的PDP-1系統。這一系統大概是最早的基于容量架構(capability based architecture)的實際系統。另外1963年Ivan Sutherland的Sketchpad應用中也蘊含了同樣的思想。對象作為編程實體最早是于1960年代由Simula 67語言引入思維。Simula這一語言是奧利-約翰·達爾和克利斯登·奈加特在挪威奧斯陸計算機中心為模擬環境而設計的。(據說,他們是為了模擬船只而設計的這種語言,并且對不同船只間屬性的相互影響感興趣。他們將不同的船只歸納為不同的類,而每一個對象,基于它的類,可以定義它自己的屬性和行為。)這種辦法是分析式程序的最早概念體現。在分析式程序中,我們將真實世界的對象映射到抽象的對象,這叫做“模擬”。Simula不僅引入了“類”的概念,還應用了實例這一思想——這可能是這些概念的最早應用。
>
> 20世紀70年代施樂PARC研究所發明的Smalltalk語言將面向對象程序設計的概念定義為,在基礎運算中,對對象和消息的廣泛應用。Smalltalk的創建者深受Simula 67的主要思想影響,但Smalltalk中的對象是完全動態的——它們可以被創建、修改并銷毀,這與Simula中的靜態對象有所區別。此外,Smalltalk還引入了繼承性的思想,它因此一舉超越了不可創建實例的程序設計模型和不具備繼承性的Simula。此外,Simula 67的思想亦被應用在許多不同的語言,如Lisp、Pascal。
>
> 面向對象程序設計在80年代成為了一種主導思想,這主要應歸功于C++——C語言的擴充版。在圖形用戶界面(GUI)日漸崛起的情況下,面向對象程序設計很好地適應了潮流。GUI和面向對象程序設計的緊密關聯在Mac OS X中可見一斑。Mac OS X是由Objective-C語言寫成的,這一語言是一個仿Smalltalk的C語言擴充版。面向對象程序設計的思想也使事件處理式的程序設計更加廣泛被應用(雖然這一概念并非僅存在于面向對象程序設計)。一種說法是,GUI的引入極大地推動了面向對象程序設計的發展。
>
> 蘇黎世聯邦理工學院的尼克勞斯·維爾特和他的同事們對抽象數據和模塊化程序設計進行了研究。Modula-2將這些都包括了進去,而Oberon則包括了一種特殊的面向對象方法——不同于Smalltalk與C++。
>
> 面向對象的特性也被加入了當時較為流行的語言:Ada、BASIC、Lisp、Fortran、Pascal以及種種。由于這些語言最初并沒有面向對象的設計,故而這種糅合常常會導致兼容性和維護性的問題。與之相反的是,“純正的”面向對象語言卻缺乏一些程序員們賴以生存的特性。在這一大環境下,開發新的語言成為了當務之急。作為先行者,Eiffel成功地解決了這些問題,并成為了當時較受歡迎的語言。
>
> 在過去的幾年中,Java語言成為了廣為應用的語言,除了它與C和C++語法上的近似性。Java的可移植性是它的成功中不可磨滅的一步,因為這一特性,已吸引了龐大的程序員群的投入。
>
> 在最近的計算機語言發展中,一些既支持面向對象程序設計,又支持面向過程程序設計的語言悄然浮出水面。它們中的佼佼者有Python、Ruby等等。
>
> 正如面向過程程序設計使得結構化程序設計的技術得以提升,現代的面向對象程序設計方法使得對設計模式的用途、契約式設計和建模語言(如UML)技術也得到了一定提升。
列位看官,當您閱讀到這句話的時候,我就姑且認為您已經對面向對象有了一個模糊的認識了。那么,類和OOP有什么關系呢?
[維基百科](http://zh.wikipedia.org/wiki/%E7%B1%BB_%28%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6%29)中這樣定義了類:
> 在面向對象程式設計,類(class)是一種面向對象計算機編程語言的構造,是創建對象的藍圖,描述了所創建的對象共同的屬性和方法。
>
> 類的更嚴格的定義是由某種特定的元數據所組成的內聚的包。它描述了一些對象的行為規則,而這些對象就被稱為該類的實例。類有接口和結構。接口描述了如何通過方法與類及其實例互操作,而結構描述了一個實例中數據如何劃分為多個屬性。類是與某個層的對象的最具體的類型。類還可以有運行時表示形式(元對象),它為操作與類相關的元數據提供了運行時支持。
支持類的編程語言在支持與類相關的各種特性方面都多多少少有一些微妙的差異。大多數都支持不同形式的類繼承。許多語言還支持提供封裝性的特性,比如訪問修飾符。類的出現,為面向對象編程的三個最重要的特性(封裝性,繼承性,多態性),提供了實現的手段。
看到這里,看官或許有一個認識,要OOP編程,就得用到類。可以這么說,雖然不是很嚴格。但是,反過來就不能說了。不是說用了類就一定是OOP。
## 編寫類
對類的理解,需要看官有一定的抽象思維。因為類(Class)本身所定義的是某事物的抽象特點。例如定義一個類:
~~~
class Human: #這是定義類的方法,通常類的名稱用首字母大寫的單詞或者單詞拼接
pass
~~~
好,現在就從這里開始,編寫一個類,不過這次我們暫時不用python,而是用偽代碼,當然,這個代碼跟python相去甚遠。如下:
~~~
class Human:
四肢
性格
愛好
學習()
~~~
對象(Object)是類的實例。剛才已經定義了一個名字為Human的類,從而定義了世界上所有的Human,但是這是一個抽象的Human,不是具體某個人。而對一個具體的人,他的四肢特點、性格、愛好等都是具體的,這些東西在這里被稱之為屬性。
下面就找一個具體的人:王二麻子,把上面的類實例化。
~~~
王二麻子 = Human()
王二麻子.四肢 = 修長
王二麻子.愛好 = 看MM
~~~
在這里,王二麻子就是Human這個類的一個實例。一個具體對象屬性的值被稱作它的“狀態”。(系統給對象分配內存空間,而不會給類分配內存空間,這很好理解,類是抽象的系統不可能給抽象的東西分配空間,對象是具體的)
行文至此,看官是不是大概對類有了一個模糊的認識了呢?
鑒于類,距離我們的直觀感覺似乎有點遠。所以,要慢慢道來。本講內容不多,盼望看官能理解。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python