Try   HackMD

大家應該都聽說過,python是一個物件導向的程式語言。那物件導向到底是什麼呢?

物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有物件概念的程式程式設計典範,同時也是一種程式開發的抽象方針。它可能包含資料、屬性、程式碼與方法。物件則指的是類別的實例。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性,物件裡的程式可以存取及經常修改物件相關連的資料。在物件導向程式程式設計裡,電腦程式會被設計成彼此相關的物件。


上面那段參考自wiki,如果本教阿只要說這些那就不是本教阿了。

在python之中,我們通常不是直接撰寫物件,而是使用class這個關鍵字來起頭--相信各位可以簡單地知道,class翻成中文是類別,對,也就是wiki提到的「類別的實例」的類別。

直接用這種抽象名詞很難理解,我們不妨想像一下:世界上有一種動物叫做人,我們要分辨不同的人需要一些資訊--名字、身高、體重、性別、年齡、外貌等等。

class Human:
    def __init__(self):
        self.name = ''

        #他有180公分高
        self.height = 180
         
        #有80公斤重
        self.weight = 80
        (下略)

我們先暫時忽略一些奇妙的關鍵字,可以看到這就是我們在python中定義類別的方法--由class帶頭,底下跟著的則是一些def。

而在這之中,類別會有的第一個def都會是init,他是初始化的縮寫,代表這個類別一開始需要有哪些資訊。而在這裏面定義的資訊,比方說姓名、身高、體重等,就稱作屬性。我們可以在上面wiki的節錄中看到屬性這個名詞。

屬性通常是這個類別都有的特性,以人類為例,最常看見的屬性就是這些。

注意:這個時候還不是物件喔!

定義完類別之後,我們當然想把一個我們熟知的人類套用進範例看看,這個時候我們通常會看到程式是這樣寫的

小明 = Human()

我們取一個名稱,定義這個名稱為剛剛有定義過的「類別」。這個瞬間,我們真正有了一個可以操作(?)的人類,他的名字叫做小明。

這個小小的,大家都很習慣的動作也就是wiki中提到的「類別的實例」。有點像是我們在人滿為患的夜市中大喊「人!」,則根本沒人知道你在找誰,但大喊「小明!」就不一定了。

指定一個具名變數為某一種類別,這個動作我們稱作實例化,也就是把還虛無飄渺的類別變成一個可操作的實體的過程--也可以說從這個瞬間開始,程式開始浪費了一塊記憶體來存這個物件。

而屬性當然是可以被更改的:

小明.name = '王翰明'

就像這樣,透過物件的名稱 + .屬性名稱,就能跟以前變更變數屬性一般去變更物件的屬性。

這時候聰明的各位肯定有個疑問了,在定義類別的時候,我們明明寫的是self.name,這時候為什麼不是寫成這樣呢?

小明.self.name = '王翰明'

我們不妨想像一下,大家通常都會取綽號,而某個人的綽號叫做小明。當有一天,一個人突然問:「小明原本叫什麼名字啊?」的時候,會聽到什麼回答呢?

如果是他的朋友可能會這樣說:「小明的本名是王翰明啊。」

而如果被問的是小明,會這樣說:「我的本名是王翰明。」

這裡就體現出self這個關鍵字的意義了,我們在物件內找自己的屬性(類似小明回答自己的名字),當然不會用第三人稱--抱歉可能有些人會,但我們請忽略這種特例--來稱呼自己,因此就會有我(self)這種關鍵字。self這個關鍵字的用法在下一篇開始講物件的方法之後就會很常看到了,請稍微放在心上。

而外部的人(朋友)當然也不會用「我」來為小明介紹,而是以小明的名字稱呼。

小明.name = '王翰明'

這時候這段程式碼為什麼沒有self也就比較好理解了吧。

物件導向屬於程式的一種抽象化概念,也就是把原本很具體的東西變得很不具體(X)。我們會稍微多花一點篇幅來介紹這個近代程式語言最重要的概念之一,下一期我們將會討論所謂的「方法」