【Python】Learn Python the hard way, ex40 模組,類和物件,這個解釋比較容易理解
阿新 • • 發佈:2019-01-08
#coding:utf-8 ''' 理解類和模組 Python是一種面向物件程式設計(OOP)語言。這個說法的意思是,Python裡邊有一種叫做類(class)的結構,通過它可以用一種特殊的方法構造軟體。 通過使用類,可以讓程式架構更為整齊,使用起來也更加乾淨 -- 至少理論上應該是這樣的。 首先,使用字典來幫助理解模組 比如,定義以下一個字典 mystuff = {'apple': "I AM APPLES!"} print mystuff['apple'] 再來看模組, 1, 模組是包含函式和變數的Python檔案 2, 可以匯入這個檔案 3, 然後可以使用.操作符訪問模組中的函式和變數 使用模組實現上述功能: 先定義一個叫做mustuff.py的模組,並且裡邊放了個叫做apple的函式: #this goes in mystuff.py def apple(): print "I AM APPLE!" 接下來就可以用import來呼叫這個模組,並且訪問apple函式 improt mystuff mystuff.apple() 還可以放一個叫tangerine的變數到模組裡邊: def apple(): print "I AM APPLE!" # this is just a variable tangerine = "Living reflection of a dream" 同樣,還是可以訪問這個變數: import mystuff mustuff.apple() print mystuff.tangerine 回到字典的概念,你會發現這個和字典的使用方法有點兒類似,只不過語法不同而已: mystuff['apple'] #get apple from dict mystuff.apple() #get apple from the module mystuff.tangerine #same thing, it's just a variable 也就是說,Python裡邊由這麼一個通用的模式: 1,拿一個類似”鍵=值“風格的容器: 2,通過“鍵”的名稱可以獲取其中的值 對於字典來說,鍵是一個字串,獲得值得語法是"[鍵]“。 對於模組來說,鍵是函式或者變數的名稱,而語法是“.鍵”。除了這個,基本上就沒有區別了。 接著,藉助模組來理解類 模組還可以用一種方法去理解:可以把他們當做一種特殊的字典,通過他們可以儲存一些Python程式碼,可以通過“.”操作符訪問這些程式碼。 Python還有另外一種程式碼結構用來實現類似的目的,那就是類,通過類,你可以把一組函式和資料放到一個容器中,從而用“.”操作符訪問他們。 如果要建立mystuff模組的方法來建立一個類,那麼方法大致是這樣: class Mystuff(object): def __init__(self): self.tangrine = "And now a thousand years between" def apple(self): print "I AM APPLE!" 難懂的恐怕是__init__()函式,還有就是設定tangerine變數時用了self.tangerine這樣的語法。 使用類而非模組的原因如下: 可以拿上面這個類重複創建出很多,哪怕是一次一百萬個,他們也互不干涉。 而對於模組來說,一次匯入之後,整個程式裡就只有這麼一份內容,只有鼓搗得很深才能弄出點花樣出來。 在弄懂類這個概念之前,需要先理解”物件“(object)是什麼東西,以及如何使用MyStuff達到類似mystuff.py模組的結果。 物件相當於迷你匯入 如果說類和模擬模組差不多,那麼對於類來說,也必然有一個類似匯入(import)的概念。 這個概念名稱就是“例項化”(instantiate)。這只是一種故作高深的叫法而已, 它的意思就是"建立”。當你將一個類“例項化”以後,就得到了一個物件(object) 實現例項化的方法就是像呼叫函式一樣得呼叫一個類: thing = MyStuff() thing.apple() print thing.tangerine 第一行程式碼就是“例項化”操作,這和呼叫函式很類似。然而,當你進行例項化操作時,Python在背後做了一系列的工作。 1,Python看到了MyStuff()並且知道了他是你定義過的一個類 2,Python建立了一個空物件,裡邊包含了你在該類中用def建立的所有函式。 3,然後Python回去檢查你是不是在裡邊建立了一個__init__函式,如果有建立,他就會呼叫這個函式,從而對你新建立的空物件實現了初始化。 4,在MyStuff的__init__函式中,有一個多餘的函式叫做self,這就是Python為我們建立的空物件,而我可以它進行類似模組,字典等操作,為它設定一些變數進去。 5,在這裡,我把self.tangerine設成了一段歌詞,這樣我就初始化了該物件。 6,最後Python將這個新建的物件賦給一個叫做thing的變數,以後後面使用。 這就是當你向呼叫函式一樣呼叫類的時候,Python完成這個“迷你匯入”的過程。 記住,這不是拿來一個類就直接用,而是將類當做一個“藍圖”,然後用它建立和這個類有相同屬性的副本。 提醒,這樣解釋和Python的實際原理還是有一點小小出入。事實上,類和物件與模組是完全不同的東西,這樣類比只是為了容易理解 1,類就像一種藍圖或者一種預定義的東西,通過它可以建立新的迷你模組。 2,例項化的過程相當於你建立了這麼一個迷你模組,而且同時匯入了它。 3,結果建立的迷你模組就是一個物件,你可以將它賦予一個變數並進行後續操作。 現在有3種方法可以實現獲取內容: # dict style mystuff['apple'] # module style mystuff.apple() print mystuff.tangerine # class style thing = MyStuff() thing.apple() print thing.tangerine ''' class Song(object): def __init__(self, lyrics): self.lyrics = lyrics def sing_me_a_song(self): for line in self.lyrics: print line happy_bday = Song(["Happy birthday to you", "I don't want to get sued", "So I'll stop right there"]) bulls_on_parade = Song(["They rally around the family", "With pockets full of shells"]) happy_bday.sing_me_a_song() bulls_on_parade.sing_me_a_song() """ Test Result: Happy birthday to you I don't want to get sued So I'll stop right there They rally around the family With pockets full of shells """