幫Python找「對象」

引言:你必定會感嘆:Python還缺找對象? 畢竟「一切皆對象」是人家Python的哲學理念。不過,Python 
容許程序員以純粹的面向過程的方式來使用它,因此人們有時會忽視它那顆「找對象」的心。其實不管是面向過程,仍是函數式編程,都是特殊的對象模擬出的效果。 
本文選自《從Python開始學編程》。讓咱們經過幫Python找對象,來學習Python這一語言。python

  說是要「找對象」,咱們第一個看的倒是個叫做「類」的語法結構。這裏的類其實和咱們平常生活中的「類」的概念差很少。平常生活中,咱們把相近的東西歸爲一類,並且給這個類起一個名字。好比說,鳥類的共同屬性是有羽毛,經過產卵生育後代。任何一隻特別的鳥都是創建在鳥類的原型基礎上的。 
  下面咱們用Python 語言來記錄上面的想法,描述鳥類:程序員

class Bird(object): feather = True reproduction = "egg"

  在這裏,咱們用關鍵字class 來定義一個類。類的名字就是鳥(Bird)。括號裏有一個關鍵詞object,也就是「東西」的意思,即某一個個體。在計算機語言中,咱們把個體稱爲對象。一個類別下,能夠有多個個體。鳥類就能夠包括鄰居老王養的金絲雀、天邊正飛過的那隻烏鴉,以及家裏養的一隻小黃雞。 
  冒號和縮進說明了屬於這個類的代碼。在隸屬於這個類別的程序塊中,咱們定義了兩個量,一個用於說明鳥類有羽毛(feather),另外一個用於說明鳥類的繁殖方式(reproduction),這兩個量稱爲類的屬性(attribute)。咱們定義鳥類的方法很粗糙,鳥類只不過是「有毛能產蛋」的東西。要是生物學家看到了大概會暗自搖頭,但咱們畢竟邁出了模擬世界的第一步。 
  咱們除了用數據性的屬性來分辨類別外,有時也會根據這類東西能作什麼事情來區分。好比說,鳥會移動。這樣,鳥就和房屋的類別就區分開了。這些動做會帶來必定的結果,好比移動致使位置的變化。這樣的一些「行爲」屬性稱爲方法(method)。Python 中,通常經過在類的內部定義函數來講明方法。編程

class Bird(object): feather = True reproduction = "egg" def chirp(self, sound): print(sound)

  咱們給鳥類新增一個方法屬性,就是表示鳥叫的方法chirp()。方法chirp()看起來很像一個函數。它的第一個參數是self,是爲了在方法內部引用對象自身,我將在後面詳細解釋。須要強調的是,不管該參數是否用到,方法的第一個參數必須是用於指代對象自身的self。剩下的參數sound 是爲了知足咱們的需求設計的,它表明了鳥叫的內容。方法chirp()會把sound 打印出來。微信

對象

  咱們定義了類,但和函數定義同樣,這還只是打造兵器的過程。爲了使用這個利器,咱們須要深刻到對象的層面。經過調用類,咱們能夠創造出這個類下面的一個對象。好比說,我養了一隻小雞,叫summer。它是個對象,且屬於鳥類。咱們使用前面已經定義好的鳥類,產生這個對象:函數式編程

summer = Bird() 

  經過這一句建立對象,並說明summer 是屬於鳥類的一個對象。如今,咱們就可使用鳥類中已經寫好的代碼了。做爲對象的summer 將擁有鳥類的屬性和方法。對屬性的引用是經過對象.屬性(object.attribute)的形式實現的。好比說:函數

print(summer.reproduction) # 打印'egg' 

  用上面的方式,咱們獲得summer 所屬類的繁殖方式。 
  此外,咱們還能夠調用方法,讓summer 執行鳥類容許的動做。好比:學習

summer.chirp("jijiji") # 打印'jijiji' 

  在調用方法時,咱們只傳遞了一個參數,也就是字符串」jijiji」。這正是方法與函數有所區別的地方。儘管在定義類的方法時,咱們必須加上這個self 參數,但self 只用能在類定義的內部,因此在調用方法時不須要對self 傳入數據。經過調用chirp()方法,個人summer 就能夠叫了。 
  到如今爲止,描述對象的數據都存儲於類的屬性中。類屬性描述了一個類的共性,好比鳥類都有羽毛。全部屬於該類的對象會共享這些屬性。好比說,summer 是鳥類的一個對象,所以summer 也有羽毛。固然,咱們能夠經過某個對象來引用某個類屬性。 
  對於一個類下的所有個體來講,某些屬性可能存在個體差別。好比說,個人summer 是黃色的,但並不是全部的鳥兒都是黃色的。再好比說人這個類。性別是某我的的一個性質,不是全部的人類都是男,或者都是女。這個性質的值隨着對象的不一樣而不一樣。李雷是人類的一個對象,性別是男。韓美美也是人類的一個對象,性別是女。 
  所以,爲了完整描述個體,除了共性的類屬性外,咱們還須要用於說明個性的對象屬性。在類中,咱們能夠經過self 來操做對象的屬性。如今咱們拓展Bird 類:spa

class Bird(object): def chirp(self, sound): print(sound) def set_color(self, color): self.color = color summer = Bird() summer.set_color("yellow") print(summer.color) # 打印'yellow' 

  在方法set_color()中,咱們經過self 參數設定了對象的屬性color。和類屬性同樣,咱們能經過對象.屬性的方式來操做對象屬性。因爲對象屬性依賴於self,因此咱們必須在某個方法內部才能操做類屬性。所以,對象屬性沒辦法像類屬性同樣,在類下方直接賦初值。 
  但Python 仍是提供了初始化對象屬性的辦法。Python 定義了一系列特殊方法。特殊方法又被稱爲魔法方法(Magic Method)。特殊方法的方法名很特別,先後有兩個下畫線,好比init()、add()、dict()等。程序員能夠在類定義中設定特殊方法。Python 會以特定的方式來處理各個特殊方法。對於類的init()方法,Python 會在每次建立對象時自動調用。所以,咱們能夠在init()方法內部來初始化對象屬性:.net

class Bird(object): def __init__(self, sound): self.sound = sound print("my sound is:", sound) def chirp(self): print(self.sound) summer = Bird("ji") summer.chirp() # 打印'ji' 

  在上面的類定義中,咱們經過init()方法說明了這個類的初始化方式。每當對象創建時,好比建立summer 對象時,init()方法就會被調用。它會設定sound 這個對象屬性。在後面的chirp()方法中,就能夠經過self 調用這一對象屬性。除了設定對象屬性外,咱們還能夠在init()中加入其餘指令。這些指令會在建立對象時執行。在調用類時,類的後面能夠跟一個參數列表。這裏放入的數據將傳給init()的參數。經過init()方法,咱們能夠在建立對象時就初始化對象屬性。 
  除了操做對象屬性外,self 參數還有另一個功能,就是能讓咱們在一個方法內部調用同一類的其餘方法,好比:設計

class Bird(object): def chirp(self, sound): print(sound) def chirp_repeat(self, sound, n): for i in range(n): self.chirp(sound) summer = Bird() summer.chirp_repeat("ji", 10) # 重複打印'ji'10 次

  在方法chirp_repeat()中,咱們經過self 調用了類中的另外一個方法chirp()。

  Python的對象不少也頗有趣,好比前面的文章《那些Python意想不到的對象》。若與這些對象深刻交往,你會發現Python更多的魔力。更多內容可見《從Python開始學編程》一書。

  本文選自《從Python開始學編程》,點此連接可在博文視點官網查看此書。 
                     圖片描述

想及時得到更多精彩文章,可在微信中搜索「博文視點」或者掃描下方二維碼並關注。
                       圖片描述

相關文章
相關標籤/搜索