Python Object-oriented Programming -1 Overview

Young Chen
宅男雜誌
Published in
3 min readFeb 4, 2020

Why OOP(Object-oriented Programming)?

關於為何要使用物件導向設計其實在工作以來也很難清楚的回答,趁這次研究好好探討一下為何需要使用OOP以及Python的OOP

主流程式語言如Java, C++…,物件導向程式設計已經是標準配備,不過過去學習時有點像是強迫塞入,也沒什麼機會去解釋為何我需要這樣設計自己的程式。我找了找資料嘗試尋找問題的答案,關於為何需要採用物件導向程式設計,有以下幾點解釋:

  • 模組化更好除錯
  • 透過繼承(inheritance)程式碼重用
  • 透過多型(polymorphism)讓程式碼更有彈性
  • 問題解決更有效率

嗅到以上關鍵字相信是開發工作者都會感到有興趣,誰不想要手頭上的東西都好搞好用有彈性有效率?但研究物件導向時,最痛苦的莫過於必須要先知道許多名詞的定義。常見名詞如下:

江湖傳言,物件導向程式語言必須符合三種特性/要件:

  • 封裝(Encapsulation): 將資料與函數放在一種稱為物件的結構中
  • 繼承(Inheritance): 子物件可以繼承父物件的所有欄位與屬性,並且可以新增欄位或修改函數。
  • 多型(Polymorphism): 單一介面操作多種型態的物件,不同形態的物件可以定義相同的介面但不同行為。可以簡單講:定義名稱相同的方法,傳入不同參數(訊息)會執行不同行為

看完定義衍生更多看不懂的東西了!到底!

關於這些疑問,看了良葛格這篇似乎若有似無的參透了一點點…節錄一些我覺得有種醍醐灌頂的說明:

真正封裝程式的是函式,如果有一組函式,可以接受物件(資料複合體)進行運算,就可以說這組函式是物件的方法(Method)

類別的本質就是便於管理與約束物件,然而,管理的另一面,就是失去某種程度的彈性,類別約束性越強(例如Java),語言就越不靈活。

語言不會是完美的,也應該是能演化的,就修補語言而言,這又很重要,所以,任何語言勢必都要權衡類別的約束與彈性。

繼承的本質是重用其他類別的方法,因此,如果從這方面出發,「組合模式」也算是繼承的實現之一(而不只是模擬繼承)

物件導向是設計上一種演化的方向,有心或沒有心,指的是開發者有沒有持續地檢討設計,以及當時的需求下是否適合朝該方向演化,而不是一味地套用封裝、繼承的語法或術語。

又參考了一些維基百科關於OOP的說明,慢慢地勾勒清楚可能是什麼事情:

物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有物件概念的程式程式設計典範,同時也是一種程式開發的抽象方針。它可能包含資料屬性程式碼方法

物件導向程式設計可以看作一種在程式中包含各種獨立而又互相呼叫的物件的思想

物件導向程式設計中的每一個物件都應該能夠接受資料、處理資料並將資料傳達給其它物件,因此它們都可以被看作一個小型的「機器」,即物件。

探索了各處定義,小結一下我對於物件導向程式設計的理解:

  • 使用該設計方式可以擁有較高的彈性/維護性
  • 被稱為物件導向程式語言通常擁有幾個常見的特性:封裝、繼承、多型
  • 物件導向程式設計概念上有點是一個不斷檢討自己程式設計會自然而然發生的改變
  • Python支援程序導向程式設計也支援物件導向程式設計

關於定義有了點概念,下篇將著重在Python如何實作OOP以及在程式碼中重新解釋上述提及的定義,看定義還是比較痛苦,實作試試會更有感!

--

--

Young Chen
宅男雜誌

曾經是全端工程師,目前在資料科學團隊中主要負責雲端架構相關工作,透過自學正在資料科學領域相關知識耕耘中。mail: chiyoung0307@gmail.com