Python使用類別(class)和物件(object),進行物件導向(object-oriented programming,簡稱OOP)的程式設計。
物件導向的最主要目的是提高程式的重複使用性。我們這麼早切入物件導向程式的原因是,Python的整個概念是基於物件的。了解OOP是進一步學習Python的關鍵。
以下是對物件導向的一種理解,基於分類。
在人類認知中,會根據屬性相近把東西歸類,並且給類別命名。比如說,鳥類的共同屬性是有羽毛,透過產卵來生育後代。任何一隻特別的鳥都在鳥類的原型上的。
物件導向就是模擬了以上人類認知過程。在Python語言,為了聽起來酷,我們把上面說的「東西」稱為物件(object)。
先定義鳥類
class Bird(object): have_feather = True way_of_reproduction = 'egg'
我們定義了一個類別(class),就是鳥(Bird)。在隸屬於這個類比的語句區塊中,我們定義了兩個變數,一個是有羽毛(have_feather),一個是生殖方式(way_of_reproduction),這兩個變數對應我們剛才說的屬性( attribute)。我們暫時先不說明括號以及其中的內容,記為問題1。
假設我養了一隻小雞,叫summer。它是個對象,且屬於鳥類。使用前面定義的類別:
summer = Bird() print summer.way_of_reproduction
透過第一句建立物件,並說明summer是類別鳥中的一個對象,summer就有了鳥的類別屬性,對屬性的引用是透過物件.屬性(object.attribute) 的形式實現的。
可憐的summer,你就是毛產的蛋貨,好不精緻。
日常認知中,我們在透過屬性辨識類別的時候,有時會根據這個東西能做什麼事情來區分類別。比如說,鳥會移動。這樣,鳥就和房子的類別區分開了。這些動作會帶來一定的結果,例如移動導致位置的改變。
這樣的一些「行為」屬性為方法(method)。 Python中透過在類別的內部定義函數,來說明方法。
class Bird(object): have_feather = True way_of_reproduction = 'egg' def move(self, dx, dy): position = [0,0] position[0] = position[0] + dx position[1] = position[1] + dy return position summer = Bird() print 'after move:',summer.move(5,8)
我們重新定義了鳥這個類別。鳥新增一個方法屬性,就是表示移動的方法move。 (我承認這個方法很傻,你可以在看過下一講之後定義個有趣些的方法)
(它的參數中有一個self,它是為了方便我們引用對象自身。方法的第一個參數必須是self,不論是否用到。 move方法會最終傳回運算過的position。
在最後呼叫move方法的時候,我們只傳遞了dx和dy兩個參數,不需要傳遞self參數(因為self只是為了內部使用)。
我的summer可以跑了。
子類別
比如說,鳥類可以進一步分成雞,大雁,黃鷂。
在OOP中,我們透過
繼承