給自己的Python小筆記: 物件導向設計OOP教學. 哈囉 - Chwang
文章推薦指數: 80 %
給自己的Python小筆記: 物件導向設計OOP教學. 哈囉,今天來跟大家介紹一下物件導向設計OOP,相信大家學程式就算沒用到,也都一定會聽到OOP這個概念,在學習程式的過程 ...
GetunlimitedaccessOpeninappHomeNotificationsListsStoriesWrite給自己的Python小筆記:物件導向設計OOP教學哈囉,今天來跟大家介紹一下物件導向設計OOP,相信大家學程式就算沒用到,也都一定會聽到OOP這個概念,在學習程式的過程中,你可能會覺得物件導向這個名詞有聽過,也知道它有三大特性,但好像不一定要用到,我們今天就來一起看看物件導向設計是做什麼的,用了可以幹麻1.物件導向設計與程序導向設計差異a.程序導向設計:簡單來說,以函式當程式的基本單元,就是在撰寫專案程式的過程中,我只使用函式(function(def))來寫下我的功能,並用排序的方式來讓程式知道依序跑哪個function,然後通過將比較大的函式切割成多個小函式,來降低程式維護的複雜度。
b.物件導向設計:簡單來說,以物件當成式的基本單元,就是在撰寫專案程式的過程中,我使用了Class類來創立各種物件,並透過物件間互相傳遞與接收訊息,達成專案的目的。
2.為什麼要使用物件導向設計:啊我程序導向設計寫得好好的,幹嘛要會物件導向設計a.更容易閱讀:每個類(Class)都清楚定義了功能,讓使用者可以輕鬆閱讀與理解程式邏輯b.更好維護與新功能添加:維護上可以清楚針對需要的類(Class)或物件進行修改,也更好擴充新的功能到指定的類(Class)3.物件導向三大特性:繼承(inheritance)、封裝(encapsulation)、多型(polymorphism)a.繼承(inheritance):簡單來說就是子類別(subclass)繼承一個父類別(class),小朋友繼承了父親有的特性,除非屬性被隱藏起來,設定為private,不然都會被繼承,也就是public屬性都會被繼承b.封裝(encapsulation):簡單來說,封裝其實就是將程式包成一個一個的類(class)和函式(function),使用者不需要注意裡面的細節,只要會使用接口就好,像是類.函式名稱()c.多型(polymorphism):簡單來說就是大家都繼承了相同的類別,也呼叫相同的函式,但結果卻不同4.Class繼承(inheritance)簡單來說就是子類別(subclass)繼承一個父類別(class),小朋友繼承了父親有的特性,除非屬性被隱藏起來,設定為private,不然都會被繼承,也就是public屬性都會被繼承a.繼承的使用方法:Class(類別)名稱後面的()中,寫下父類別的類別名稱,下面的程式舉例幾種繼承的方法,每個方法中都實作出子類別可以繼承父類別的公開的屬性(實體與類別屬性),也可以自己新增(覆寫)一些屬於子類別才有的屬性i.第一種方法:使用Dad_Ken.__init__(self)來繼承,(優點)明確知道指向哪個父類別,(缺點)會有一個麻煩的地方只要繼承的類別改變,就要更動ii.第二與第三種方法:使用super(Child_Jen,self).__init__()或super().__init__(),他們都改善了第一種方法的缺點,使用這兩種方法還有一個重要原因就是DependencyInjection(依賴注入),那是什麼?簡單來說,就是物件在create時會產生自己需要的dependency,而依賴注入,就是需要的dependency由client端注入。
iii.檢查繼承關係的方法:issubclass(子類別,父類別),issubclass(Child_Jen,Dad_Ken),如果是的話就會返回Trueiiii.私有屬性:原則上父類別的私有屬性不會被繼承,除非父類別有設定其他公開的方式取得私有屬性,舉例:__child透過child()獲得##父類別classDad_Ken:first_name=‘Hsu’##私有屬性__child=1def__init__(self):self.address=‘anyTownanyStreet’self.blood=‘o’self.phone_number=‘0931xx’##私有屬性Dad_Ken.__child+=1@propertydefcook(self):return“Icancook”##私有屬性取得方式@classmethoddefchild(cls):returncls.__child##子類別繼承父類別##第一種方法classChild_Jen(Dad_Ken):def__init__(self):Dad_Ken.__init__(self)@propertydefswim(self):return“Icanswim,butmyfathercan’t”##第一種方法Jen=Child_Jen()print(Jen.first_name)#Hsuprint(Jen.address)#anyTownanyStreetprint(Jen.blood)#oprint(Jen.cook)#Icancookprint(Jen.swim)#Icanswim,butmyfathercan’tprint(Jen.child())#2##私有屬性取得Ken=Dad_Ken()#print(Ken.swim)#AttributeError:‘Dad_Ken’objecthasnoattribute‘swim’print(Ken.child())#3##私有屬性取得##繼承檢查print(issubclass(Dad_Ken,Child_Jen))##Falseprint(issubclass(Child_Jen,Dad_Ken))##True##第二種方法classChild_Una(Dad_Ken):def__init__(self):super(Child_Una,self).__init__()@propertydefbasketball(self):return“Ilovetoplaaybasketball”Una=Child_Una()print(Una.first_name)#Hsuprint(Una.basketball)#Ilovetoplaaybasketballprint(Una.cook)#Icancookprint(Una.child())#4##第三種方法classChild_Jack(Dad_Ken):def__init__(self):super().__init__()@propertydefrun():return“Icanrunfast”Jack=Child_Jack()print(Jack.first_name)#Hsu#print(Jack.basketball)#AttributeError:‘Child_Jack’objecthasnoattribute‘basketball’print(Jack.cook)#Icancookprint(Jack.child())#55.多重繼承a.多重繼承使用方法:i.Class(類別)名稱後面的()中,寫下所有父類別的類別名稱,格式:子類別(父類別1,父類別2)、subclass(superclass1,superclass2)ii.如果所有的父類別擁有相同的屬性,以最左邊的父類別繼承的為優先iii.當兩個父類別都有__init__時,只會繼承最左邊父類別的__init__底下屬性,但如果有不同的function名稱,就可以都繼承,像是:print(Tom.blood)##AttributeError:‘Child_Tom’objecthasnoattribute‘blood’當兩個父類別都有__init__時,只會繼承最左邊父類別的__init__底下屬性print(Tom.cook)#Icancookprint(Tom.cure)#Icancuremyself舉例:##父類別1classDad_Ken:first_name=‘Hsu’##私有屬性__child=1def__init__(self):self.address=‘anyTownanyStreet’self.blood=‘o’self.phone_number=‘0931xx’##私有屬性Dad_Ken.__child+=1@propertydefcook(self):return“Icancook”##私有屬性取得方式@classmethoddefchild(cls):returncls.__child##父類別2classMon_Linda():first_name=‘Zin’def__init__(self):self.mom=‘Linda’@propertydefcure(self):return“Icancuremyself”##子類別classChild_Tom(Mon_Linda,Dad_Ken):def__init__(self):super().__init__()Tom=Child_Tom()print(Tom.first_name)##Zin以左邊的父類別為優先繼承print(Tom.blood)##AttributeError:‘Child_Tom’objecthasnoattribute‘blood’當兩個父類別都有__init__時,只會繼承最左邊父類別的__init__底下屬性print(Tom.mom)#Lindaprint(Tom.cook)#Icancookprint(Tom.cure)#Icancuremyself6.多型(polymorphism)簡單來說就是大家都繼承了相同的類別,也呼叫相同的函式,但結果卻不同舉例:父類別(Dad_Ken)有個屬性cook,兩個子類別(TonnyandTim)都繼承了這個屬性,但呼叫屬性後,產生的結果不同,說明了Python會根據指定的Class(類別),來決定如何實作方法##父類別classDad_Ken:def__init__(self):self.name=‘DadKen’def__str__(self):returnstr(self.name)defcook(self):print(‘Cookby‘+self.__str__())##子類別1classChild_Tonny(Dad_Ken):def__init__(self):super().__init__()self.name=‘Tonny’def__str__(self):returnstr(self.name)##子類別2classChild_Tim(Dad_Ken):def__init__(self):super().__init__()self.name=‘Tim’def__str__(self):returnstr(self.name)print(Dad_Ken().cook())#CookbyDadKenprint(Child_Tonny().cook())#CookbyTonnyprint(Child_Tim().cook())#CookbyTim7.封裝簡單來說,封裝其實就是將程式包成一個一個的類(class)和函式(function),使用者不需要注意裡面的細節,只要會使用接口就好,像是類.函式名稱()1.Public:使用者只要知道類裡面有什麼函式可以使用,即可輕鬆使用,不需要知道太多程式過程細節2.Private:有些屬性不想讓外界的人直接閱讀的屬性a.目的:很簡單,就是過往我們在Class裡面的屬性都是門戶洞開的,任何人都能輕易看到裡面的內容,但是我們有時候想要一點隱私(private),就是不想被別人輕鬆看見,所以我們要用封裝的方法,將屬性隱藏起來,但我們自己要讀,所以我們要用別的方式讀取這些屬性內容b.怎麼做:我們只要將想要隱藏的屬性是別字加上__(兩個底線)就能輕鬆實現classHouse:def__init__(self,address,name,phone_number):self.__address=addressself.__name=nameself.phone_number=phone_numberself.member=0little_turtle_home=House(‘anyTownanyStreet’,‘Turtle’,‘09xx’)print(little_turtle_home.phone_number)##沒封裝成私有:09xxprint(little_turtle_home.__address)##有封裝成私有:AttributeError:‘House’objecthasnoattribute‘address’希望這次也對大家有很多的幫助!!Reference:https://medium.com/@zxuanhong/dependency-injection%E6%98%AF%E4%BB%80%E9%BA%BC-ae83f7f87d6dhttps://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/115956/https://medium.com/tsungs-blog/python-%E5%88%9D%E6%8E%A2%E7%89%A9%E4%BB%B6%E5%B0%8E%E5%90%91-59c97981c7d6MorefromChwangFollowYO~~大家好我是一名AI人工智慧領域的小小工程師,熱愛自學,熱愛分享,下班後的我想為自己Coding,積極撰寫教學文,想將自學的程式知識分享給大家,不斷追求進步的自己,希望有一天能回饋社會,幫助需要幫助的人,如果您有什麼很酷的想法,也覺得我還行,歡迎您找我合作~~Lovepodcastsoraudiobooks?Learnonthegowithournewapp.TryKnowableAboutHelpTermsPrivacyGettheMediumappGetstartedChwang108FollowersYO~~大家好我是一名AI人工智慧領域的小小工程師,熱愛自學,熱愛分享,下班後的我想為自己Coding,積極撰寫教學文,想將自學的程式知識分享給大家,不斷追求進步的自己,希望有一天能回饋社會,幫助需要幫助的人,如果您有什麼很酷的想法,也覺得我還行,歡迎您找我合作~~FollowHelpStatusWritersBlogCareersPrivacyTermsAboutKnowable
延伸文章資訊
- 1使用Python 的物件導向程式設計簡介- Training - Microsoft Docs
本課程模組會示範如何使用物件導向程式設計(OOP) 概念來建立問題的模型。
- 2[第11 天] 物件導向(2)Python - iT 邦幫忙
我們在開始討論Python 物件導向之前再看一個熟悉的例子,藉此瞭解屬性與方法是什麼。 屬性與方法. 一個物件(Object)可以包含屬性(Attribute)與方法(Method),我們 ...
- 3Python 入門指南- 單元10 - 物件導向與封裝 - 程式語言教學誌
本篇文章介紹Python 物件導向程式設計的觀念,包括封裝、繼承及多型。 ... 物件導向程式設計(object-oriented programming) 有三大基本特性,分別是 ...
- 4給自己的Python小筆記: 物件導向設計OOP教學. 哈囉 - Chwang
給自己的Python小筆記: 物件導向設計OOP教學. 哈囉,今天來跟大家介紹一下物件導向設計OOP,相信大家學程式就算沒用到,也都一定會聽到OOP這個概念,在學習程式的過程 ...
- 5[Python] 初探物件導向 - Medium
物件導向具有三大特性: · 良好的封裝能減少模組間的耦合。 · 類別內部的實作可以自由修改。 · 類別有明確的對外接口,讓外部進行呼叫。