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,無論是否用到。有關self的內容會在下一講展開)
新聞熱點
疑難解答