在學習程式語言時,或多或少都有聽過物件導向程式設計(Object-oriented programming,簡稱OOP),它是一個具有物件(Object)概念的開發方式,能夠提高軟體的重用性、擴充性及維護性,在開發大型的應用程式時更是被廣為使用,所以在現今多數的程式語言都有此種開發方式,Python當然也不例外。
而要使用物件導向程式設計就必須對類別(Class)及物件(Object)等有一些基本的了解,包含了:
- 類別(Class)
- 物件(Object)
- 屬性(Attribute)
- 建構式(Constructor)
- 方法(Method)
我們先來看一下今天要來建立的類別:
接下來就針對類別(Class)各個部分來進行介紹。
一、類別(Class)
簡單來說,就是物件(Object)的藍圖(blueprint)。就像要生產一部汽車時,都會有設計圖,藉此可以知道此類汽車會有哪些特性及功能,類別(Class)就類似設計圖,會定義未來產生物件(Object)時所擁有的屬性(Attribute)及方法(Method)。而定義類別的語法如下:
首先會有class關鍵字,接著自定類別名稱,最後加上冒號。類別名稱的命名原則習慣上使用Pascal命名法,也就是每個單字字首大寫,不得使用空白或底線分隔單字,如下範例:
二、物件(Object)
就是透過類別(Class)實際建立的實體,就像實際生產出來的汽車(例如:Mazda)。類別(Class)與物件(Object)的關係就像汽車設計圖與汽車實體。而建立物件(Object)的語法如下:
範例:
範例中的mazda即是Cars類別(Class)的物件(Object)。Python也提供了一個函式isinstance()來判斷類別(Class)與物件(Object)的關係,語法如下:
範例:
第15行由於mazda並不是Motorcycle的物件(Object),所以執行結果為False。
三、屬性(Attribute)
負責存放物件(Object)的資料。設定物件(Object)的屬性值語法如下:
範例:
從範例中可以看到,建立物件(Object)後,才可進行屬性值(Attribute)的設定。但是這種寫法當有很多屬性需進行設定時,會顯得沒有效率,所以會建議使用建構式(Constructor)來進行屬性值(Attribute)的設定,於文章第四節會來跟大家說明。而存取物件的屬性值則透過以下語法:
範例:
四、建構式(Constructor)
於建立物件(Object)的同時,會自動執行的方法(Method)。所以通常我們會在建構式(Constructor)中初始化物件(Object)的屬性值(Attribute)。至少要有一個self參數,之後利用逗號區隔其他屬性,語法如下:
而這個self是什麼意思呢?它代表了實體物件的參考,也就是目前的物件(Object)。這個self就是告訴類別(Class)目前是在設定哪一個物件的屬性(Attribute)。所以範例中的意思就是此物件的color屬性等於傳入的color屬性值,此物件的seat屬性等於傳入的seat屬性值,而傳入屬性值的方式就是在建立物件的時候,如下範例:
範例中於建立mazda物件(Object)的同時,生成其屬性並且初始化屬性值(color和seat)。你一定會想說奇怪,建構式(Constructor)的參數有三個,為什麼我們只有傳入兩個?因為第一個self參數,Python編譯器會幫我們把目前物件的參考(mazda)傳給建構式(Constructor),所以我們就不需要多此一舉傳入物件。
五、方法(Method)
可以想像是物件(Object)的行為。定義方法(Method)和函式(Function)的語法很像,都是def關鍵字開頭,接著自訂名稱,但是方法(Method)和建構式(Constructor)一樣至少要有一個self參數,語法如下:
範例:
方法(Method)的self參數同樣是代表目前的物件(mazda),在呼叫時Python編譯器會自動幫我們傳入。方法(Method)中透過self.color及self.seat的方式來存取目前物件(mazda)的color和seat屬性值,並且印出結果。
六、小結
以上就是Python類別(Class)的基本觀念介紹,希望透過此文章,可以大致瞭解整個Python類別(Class)的架構,並且有能力建立屬於自己的類別(Class)。當然其中的屬性(Attribute)又可分為:
- 實體屬性(Instance Attribute)
- 類別屬性(Class Attribute)
而方法(Method)也可分為:
- 實體方法(Instance Method)
- 類別方法(Class Method)
- 靜態方法(Static Method)
未來將會各別撰寫相關文章來詳細介紹。在練習的過程中若有碰到任何問題或說明不清楚的地方,歡迎留言與我分享!
蝦皮資深工程師來襲🤩,立即點擊圖片獲得更多資訊👆
精彩內容預告:機器學習實作(新手友善)、 Chrome Extension 擴充套件
「好文轉自古耕全–淺談Python類別(Class),如果你喜歡他的文章歡迎回到他的部落格收看更多文章😃」