Python物件導向Python類別(Class)入門篇
在學習程式語言時,或多或少都有聽過物件導向程式設計(Object-oriented programming,簡稱OOP),它是一個具有物件(Object)概念的開發方式,能夠提高軟體的重用性、擴充性及維護性,在開發大型的應用程式時更是被廣為使用,所以在現今多數的程式語言都有此種開發方式,Python當然也不例外。而要使用物件導向程式設計就必須對類別(Class)及物件(Object)等有一些基本的了解,包含了:
我們先來看一下今天要來建立的類別:
接下來就針對類別(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)又可分為:
而方法(Method)也可分為:
結語
物件導向-Class類的封裝/繼承/多型
▍為什麼要學習物件導向設計原因:
▍本篇大綱
-
首先用 Class 來定義類別
-
OOP 特性一. 繼承 (inheritance)
-
OOP 特性二. 封裝 (encapsulation)
-
OOP 特性三. 多型 (polymorphism)
-
補充:類的其他呼叫方式
首先用 Class 來定義類別
在物件導向中,類別是所有共同物件成員的抽象描述,它定義該類別物件共同具有的屬性,及實現該物件的方法。
Python 建立 class,通常類名採用大寫 (下面範例為 Employee ),在類中可以定義屬性和方法。
以下為簡單的 class 類範例:
1. self.working_hour = 0 為定義屬性
2. def work(self): 為定義方法
▍Python class 自由度很高,定義屬性的三種方法
▍物件導向有三大基本特性,分別是:
- 封裝 (encapsulation)
- 繼承 (inheritance)
- 多型 (polymorphism)
特性一. 繼承 (inheritance)
▍簡單來說:繼承就像是生活中,子女繼承父母的財產一樣。
實作 class 繼承範例:首先 Employee 是這次的父親,而 Andy 是繼承 Employee 的孩子
-
程式範例第四行 class Andy(Employee),這邊讓 Andy 繼承 Employee物件
-
程式範例第六行 super().init(),這邊 super 是呼叫父類別的語法,所以繼承了父親的能力
-
程式範例第十行 print(‘tree:’, self.cut_tree),繼承後即可調用父親能力
而如果子類有與父類擁有同名的函式,則子類會會覆蓋掉父類的函式
特性二. 封裝 (encapsulation)
▍簡單來說:隱藏程式實現細節只保留下接口,使程式容易模組化。
封裝從字面上理解就是包裝的意思,像是手機,從開機、打電話到上網我們都都不知道背後具題實現細節,但只需要按下按鈕就可以完成,這功能就是封裝。
以下範例 work() 就是封裝的表現,可以讓外部使用者不需考慮內部實作而直接呼叫使用。
若是有不想被呼叫的變數,直接在前面加上 __像是 __sleep即可以成為私有變數,如果使用者呼叫 __sleep 時則會噴 object has no attribute 的錯誤。
特性三. 多型 (polymorphism)
▍簡單來說:呼叫同名的方法時,會得到不同的結果。
如下範例 Employee、Andy 和 Joy 類別都同時擁有 work 的方法,但呼叫 w.work()、w1.work()、w2.work() 時卻有各自的表現形態。Python 會根據呼叫的類別來決定要執行哪個方法實作,這就是多型的意思。
補充:類的其他呼叫方式
jangowJP5TjQ3z202310108wbeoz