物件導向程式設計(Object-Oriented Programming, OOP)基礎 ...
文章推薦指數: 80 %
Python —物件導向程式設計(Object-Oriented Programming, OOP)基礎教學. 物件導向的三大重點為封裝(Encapsulation)、繼承(Inheritance)、多 ...
GetunlimitedaccessOpeninappHomeNotificationsListsStoriesWritePublishedin學習漂流瓶DriftBottlePython—物件導向程式設計(Object-OrientedProgramming,OOP)基礎教學物件導向的三大重點為封裝(Encapsulation)、繼承(Inheritance)、多型(Polymorphism),透過這三種方法,可使在寫程式時將內容模擬成現實的情況,換言之就是將其內容實體化,使之更容易理解。
PhotobySafarSafarovonUnsplash本文介紹會先介紹為何要使用OOP架構,其次是類別(Class)跟物件(Object)的基礎認識,最後才會進入到OOP三大架構的教學範例,依次為封裝(Encapsulation)、繼承(Inheritance)、多型(Polymorphism)。
以下正文開始~為何要使用OOP架構?何為POP?何為OOP?兩者差異在哪裡?我現在該使用OOP嗎?以一開始學習程式的菜鳥來說,普遍都是一條一條的寫程式,加上簡約的function,並以排序的方式讓程式知道code的先後順序,這就是寫程式一般常見的架構—程序導向設計(Procedure-OrientedProgramming,POP);而將物件(Object)當成基本元件,並封裝進類別(Class),以此為主架構的就是物件導向設計(Object-OrientedProgramming,OOP)。
以新手來說,根本不需要學OOP,甚至連function都不用寫,以POP的架構就可以一步一步完成作業了。
但是每樣功能存在一定都有它的道理,OOP就是軟體不停開發、演進下的一個產物,當程式能力到一定的程度後,一旦開始做比較大的專案或是計畫,則就會需要用到OOP的技巧。
OOP主是將物件作為程式的基本單元,並將程式函數等封裝於物件中,此封裝後的物件便可當作類別的範例、方法、功能等。
由此可知OOP的主要目的就是將程式內容化繁為簡,以一套明確的邏輯架構進行設計,以便加快專案的開發進度,使日後在修改、引用與使用時更為容易。
說實話,在寫這一篇文時,我也很猶豫到底要不要將它完成,畢竟網路上一搜就會有很多OOP、OOD相關的教學文章跳出來;但後來想想,若是以非本科學生的心態下去分享,相較網上其他文章也許會有很大的差異吧,對於那些想跨領域學習程式的學生也許會起到很大的幫助吧!(應該)什麼是類別(Class)?什麼是物件(Object)?在進入到封裝、繼承、多型的教學之前,還必須先了解什麼是類別(Class)跟物件(Object)。
若是上網搜尋類別(Class)和物件(Object)的關係時,普遍跳出的都會是以水果、汽車等…的舉例,沒錯!其實概念都一樣,類別(Class)就像是一概念圖、設計圖、產品的總架構等等,其包含屬性、方法等在產生物件(Object)時需要的所有要素。
其對應的相關表如下:透過上表可知類別(Class)與物件(Object)的關係對應可以是實體也可以是抽象的,只要有一架構,都可以把想呈現的東西以程式表達出來。
本文於接下來的實作會以上表第三個類別Semester為範例進行演示。
若是想更清楚了解這兩者之間的關係,建議各位可以點下面的影片看CSDojo大大的教學影片,他在敘述類別為Robot時非常完整:封裝(Encapsulation)、繼承(Inheritance)、多型(Polymorphism)教學演示封裝(Encapsulation)首先看到封裝的部分,封裝的目的在於讓程式碼更於理解,主要就是將方法(Method)、屬性(Attribute)、建構式(Constructor)封入類別的一個動作。
以Semester類別作為範例:可看到上述類別Semester將屬性(Attribute)為name、required、elective包在__init__中,且方法(Method),Schedule和Credits也一併包裝進去;之後便可建立Object為Hunter的課表和學分數;簡單來說,建構完該Class後只需輸入該學期對應之個別課程數,便會顯示出這學期總共修了多少課及必修課(Requiredsubject)、選修課(Electivesubject)的學分。
繼承(Inheritance)接續上述程式範例。
繼承主要是讓程式碼可以重複被使用,借此可以減少浪費在重複性工作的時間。
舉例來說,上述程式只有提及必修課(Requiredsubject)和選修課(Electivesubject),卻沒有考慮到通識課(Generalcourse);那就可以假定上述範例提及的類別Semester是FirstSemester,通常在FirstSemester是不會有通識課可以選的,會到SecondSemester才開始可以選。
那在這部分示範就簡單了,將上述Semester當作父類,並加入子類Semester2,當作SecondSemester的類別,其中必須加入考量Generalcourse的建構式及方法,子類必須繼承父類,才可在計算課程數與學分時更方便些。
加入子類Semester2範例如下:可看到範例中子類Semester2繼承了父類Semester的功能。
在不考慮Generalcourses的情況下,Object在輸出父類Schedule的方法時,只會顯示父類Requiredsubject和Electivesubject的總課程數。
當子類需要繼承父類的Attribute時,需加上super().__init__(),並於第二個括號中填入欲繼承的屬性。
範例中Semester2直接繼承了Semester的全部屬性,並且再加上Semester2需求的屬性,general。
故於建立Object時,若需呼叫子類則必須填上4個變數,而非原本父類的3個。
若子類和父類擁有相同名稱的函示,如範例中的Credits,則子類函示會將父類函示給覆蓋掉,優先呼叫出子類函示的結果。
多型(Polymorphism)先有繼承才有多型,繼承算是多型的基礎,主要概念為一子類繼承多個父類的功能,透過多型可使程式易於維護,是以不會動到既有程式的前提下進行設計的。
以範例應用來看,目前已有Semester和Semester2兩個類別,假定現在我需要建構一CreditsSystem(學分計算系統),以便確認在Requiredsubject、Electivesubject及Generalcourses領域到底各修習了多少學分。
加入子類CreditsSystem範例如下:上述範例可看到子類CreditsSystem繼承了父類Semester和父類Semester2,當CreditsSystem輸入對應的4個變數後,代碼會呼叫回原父類中的方法。
範例中輸入完變數後,因子類底下Semester.__init__()和Semester2.__init__()是以呼叫回各自的類別的方式設計,故在最後Object的設計時,只需直接呼叫父類的方法,便會完整輸出父類方法的結果。
此學分計算系統藉由輸入name(人名)、required(必修)、elective(選修)、general(通識)等資訊,會輸出該學生所有領域的相關學分數。
結語個人認為透過學習OOP可強化對代碼間關聯性的理解,也可以使coding能力突飛猛進,且最快讓新手看不懂你的code的方法就是用OOP下去寫,除了防止學弟抄襲你的作業外,也可以達到裝逼的效果~Morefrom學習漂流瓶DriftBottle本刊的文章大都以資料科學為主,希望能為點進來的你留下些東西。
Readmorefrom學習漂流瓶DriftBottleAboutHelpTermsPrivacyGettheMediumappGetstartedHunterCheng59FollowersMasterdegreeofIndustrialManagementFollowHelpStatusWritersBlogCareersPrivacyTermsAboutKnowable
延伸文章資訊
- 1[第11 天] 物件導向(2)Python - iT 邦幫忙
我們在開始討論Python 物件導向之前再看一個熟悉的例子,藉此瞭解屬性與方法是什麼。 屬性與方法. 一個物件(Object)可以包含屬性(Attribute)與方法(Method),我們 ...
- 2物件導向程式設計(Object-Oriented Programming, OOP)基礎 ...
Python —物件導向程式設計(Object-Oriented Programming, OOP)基礎教學. 物件導向的三大重點為封裝(Encapsulation)、繼承(Inheritanc...
- 3Python 101 基礎教學(10) - 物件導向Object-Oriented ...
物件導向Object-Oriented Programming(OOP) 是以物件的形式去描述你資料應有的行為。就像我們在現實世界中定義貓、狗、人、車等等一樣,都有自己的 ...
- 4第15 章物件與類別 - Python
支援物件的程式語言稱為「物件導向程式語言」(Object-oriented programming language, OOPL),Python 屬此類語言. (2) 類別. ∗ 類別(Clas...
- 5[Python教學]物件導向-Class類的封裝/繼承/多型 - MAX行銷誌