在上一篇,我們解釋了 Python 中一切皆為物件,和什麼是物件 Object
此篇將帶大家了解 Python 物件導向特性,從最初的 Class 類別定義開始、到物件導向的三大核心特性:繼承、封裝和多型,都有詳細的筆記和解釋教學。
▍為什麼要學習物件導向設計原因:
- 使程式碼的維護和擴充更容易
- 使人更容易閱讀理解程式碼邏輯
▍本篇大綱
- 首先用 Class 來定義類別
- OOP 特性一. 繼承 (inheritance)
- OOP 特性二. 封裝 (encapsulation)
- OOP 特性三. 多型 (polymorphism)
- 補充:類的其他呼叫方式
Table
首先用 Class 來定義類別
在物件導向中,類別是所有共同物件成員的抽象描述,它定義該類別物件共同具有的屬性,及實現該物件的方法。
Python 建立 class,通常類名採用大寫 (下面範例為 Employee ),在類中可以定義屬性和方法。
以下為簡單的 class 類範例:
1. self.working_hour = 0 為定義屬性
2. def work(self): 為定義方法
1 2 3 4 5 6 7 8 9 10 11 12 |
class Employee: def __init__(self): self.working_hour = 0 #屬性 def work(self): #方法 self.working_hour += 1 print(‘Working:’, working_hour) andy = Employee() # 類的實例化 andy.work() # 呼叫類的方法 print(andy.working_hour) # 呼叫類的屬性 |
▍Python class 自由度很高,定義屬性的三種方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class ThisTestClass: getName = 'Max' #方法一:把屬性定義寫在init外面 def __init__(self): self.getNameFromInit = ‘Max__init__’ #方法二:把屬性定義寫在init內 pass if __name__ == “__main__”: task = ThisTestClass() task.sendName = ‘Max_sendName’ ##方法三:自己給屬性與參數 print(task.getName) print(task.getNameFromInit) print(task.sendName) >>> Max >>> Max__init__ >>> Max_sendName |
▍物件導向有三大基本特性,分別是:
- 封裝 (encapsulation)
- 繼承 (inheritance)
- 多型 (polymorphism)
特性一. 繼承 (inheritance)
▍簡單來說:繼承就像是生活中,子女繼承父母的財產一樣。
實作 class 繼承範例:首先 Employee 是這次的父親,而 Andy 是繼承 Employee 的孩子
- 程式範例第四行 class Andy(Employee),這邊讓 Andy 繼承 Employee物件
- 程式範例第六行 super().init(),這邊 super 是呼叫父類別的語法,所以繼承了父親的能力
- 程式範例第十行 print(‘tree:’, self.cut_tree),繼承後即可調用父親能力
而如果子類有與父類擁有同名的函式,則子類會會覆蓋掉父類的函式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Employee: def __init__(self): self.cut_tree = 3 class Andy(Employee): def __init__(self, get_gold): super().__init__() self.get_gold = get_gold def getDetials(self): print('==getDetals==') print('tree:', self.cut_tree) print('gold:', self.get_gold) if __name__ == "__main__": andy = Andy(1) andy.getDetials() >>> tree: 3 >>> gold: 1 |
特性二. 封裝 (encapsulation)
▍簡單來說:隱藏程式實現細節只保留下接口,使程式容易模組化。
封裝從字面上理解就是包裝的意思,像是手機,從開機、打電話到上網我們都都不知道背後具題實現細節,但只需要按下按鈕就可以完成,這功能就是封裝。
以下範例 work() 就是封裝的表現,可以讓外部使用者不需考慮內部實作而直接呼叫使用。
若是有不想被呼叫的變數,直接在前面加上 __ 像是 __sleep即可以成為私有變數,如果使用者呼叫 __sleep 時則會噴 object has no attribute 的錯誤。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Employee: def __init__(self): self.cut_tree = 3 def work(self): print(‘Working’) def __sleep(self): print(‘Sleeping’) if __name__ == “__main__”: Andy = Employee() andy.work() >>> Working andy.__sleep() >>> AttributeError: ‘Employee’ object hasno attribute ‘__sleep’ |
特性三. 多型 (polymorphism)
▍簡單來說:呼叫同名的方法時,會得到不同的結果。
如下範例 Employee、Andy 和 Joy 類別都同時擁有 work 的方法,但呼叫 w.work()、w1.work()、w2.work() 時卻有各自的表現形態。Python 會根據呼叫的類別來決定要執行哪個方法實作,這就是多型的意思。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class Employee: def work(self): print(‘Employee work’) class Andy(Employee): def work(self): print(‘Andy work’) class Joy(Employee): def work(self): print(‘Joy work’) w = Employee() w1 = Andy() w2 = Joy() w.work() w1.work() w2.work() >>> Employee work >>> Andy work >>> Joy work |
補充:類的其他呼叫方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Employee: ‘’’這是__doc__資訊''' def work(self): print(‘Employee work’) w = Employee() print(w.__doc__) print(w.__class__) print(Employee.__dict__) >>> 這是__doc__資訊 >>> <class ‘__main__.Employee’> >>> {‘__module__’: ‘__main__’, ‘__doc__’:’這是__doc__資訊’, ‘work’: <function Employee.work at 0x10c579598>, ‘__dict__’: <attribute ‘__dict__’ of ‘Employee’ objects>, ‘__weakref__’: <attribute’__weakref__’ of ‘Employee’ objects>} |
[Python教學]物件導向-Class類的封裝/繼承/多型 結束囉,感謝收看!
關於 OOP 物件導向教學的延伸閱讀:
▍本站的其他相關教學:
- [Python教學] 一切皆為物件,到底什麼是物件 Object ?
- [Python教學] 物件導向 – Class 類的 封裝 / 繼承 / 多型
- [Python教學] Class / Static / Abstract Method 初探
- [Python教學] @property 是什麼? 使用場景和用法介紹
- [Python教學] 裝飾詞原理到應用
▍其他相關教學:
1. [Python 環境設置] 有一個乾淨的 Python 環境很重要,推薦你試試看 virtualenv 和 pyenv 打造乾淨的環境:
[Python教學] 使用 pyenv 和 virtualenv 打造 Python 環境配置
2. [Git 入門教學] Git 總是學了又忘?整理了 Git 入門四步驟,Git 時光機 (退版或版本切換),和如何優雅的寫好 Git Commit,這篇推薦給你:
[Git教學] 初心者懶人包 Git 入門
3. [爬蟲 + 數據分析] 爬蟲不知道要爬什麼嗎?筆者寫了蝦皮爬蟲和整理成競品賣家分析報告,想找靈感可以看看:
[非同步爬蟲] 蝦皮賣家爬蟲 GitHub 分享
[數據分析] 蝦皮賣家競品分析報告
4. [Flask 教學] 想試試看 Python 架設網站嗎?筆者整理了 Flask 學習路線圖,共 30 篇文章組成,有興趣可以收藏:
[Flask 教學] Flask 學習路線圖
5. [VSCode 推薦] 寫程式有一個好用方便上手的 IDE 編輯器很重要,列出了筆者常用的 5 個擴充套件,推薦給你試試:
Visual Studio Code 必備的 5 個擴充和小常識
有關Max行銷誌的最新文章,都會發佈在Max的Facebook粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!