1. 程式人生 > >【Python】Learn Python the hard way, ex40 模組,類和物件,這個解釋比較容易理解

【Python】Learn Python the hard way, ex40 模組,類和物件,這個解釋比較容易理解

#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

"""