OOP的教學資源

OOP
OOP(Object-oriented programming, OOP)物件導向程式設計,指一種程式設計典範,同時也是一種程式開發的方法論。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充套件性。 物件導向程式設計的雛形,早在1960年的Simula語言中即可發現,當時的程式設計領域正面臨著一種危機:在軟硬體環境逐漸複雜的情況下,軟體如何得到良好的維護?物件導向程式設計在某種程度上透過強調可重複性解決了這一問題。20世紀70年代的Smalltalk語言在物件導向方面堪稱經典——以至於30年後的今天依然將這一語言視為物件導向語言的基礎。 物件導向程式設計可以被視作一種在程式中包含各種獨立而又互相呼叫的單位和物件的思想,這與傳統的思想剛好相反:傳統的程式設計主張將程式看作一系列函式的集合,或者直接就是一系列對電腦下達的指令。物件導向程式設計中的每一個物件都應該能夠接受資料、處理資料並將資料傳達給其它物件,因此它們都可以被看作一個小型的「機器」,或者說是負有責任的角色。 目前已經被證實的是,物件導向程式設計推廣了程式的靈活性和可維護性,並且在大型專案設計中廣為應用。此外,支援者聲稱物件導向程式設計要比以往的做法更加便於學習,因為它能夠讓人們更簡單地設計並維護程式,使得程式更加便於分析、設計、理解。反對者在某些領域對此予以否認。
Hi~ 分享你的學習心得來幫助後輩或向前輩提問吧!
我要分享
我要提問

學習推薦

全部
影片
文章

不知如何開始嗎? 先進行技能挑戰吧~

技能挑戰:初級
目前等級:未達初級
12 人已通過「初級」測驗,通過率92%,和求職精靈一起探索知識、增強能力!
我要挑戰
Mike OOP

Learn Code With Mike品牌創辦人

10/22 22:01

Python封裝(Encapsulation)實用教學
Q:什麼是Python封裝(Encapsulation)
封裝(Encapsulation)的概念就有點像權限控制,有些屬性(Attribute)或方法(Method)只想於類別內部使用,而不想公開於外部,除了減少程式碼因來源端不適當的使用發生問題外,也可保護其中重要的商業邏輯。
一般情況下,來源端皆可存取類別中公開的屬性(Attribute)及方法(Method),如下範例:
# 部落格類別
class Blog:
def __init__(self):
self.author = "Mike" # 作者屬性
self.titles = [] # 文章標題屬性
def add_post(self, title): # 新增文章
self.titles.append(title)
blog = Blog()
blog.add_post("Python Programming")
blog.add_post("Learn How to Code")
print("Author: ", blog.author)
print("Blog Titles: ", blog.titles)
如果我們要防止來源端存取作者屬性(Attribute)及呼叫新增文章標題方法(Method),則需透過封裝(Encapsulation)的概念來進行設計。接下來就分別說明如何封裝(Encapsulation)類別中的屬性(Attribute)及方法(Method)。
Q:什麼是私有屬性(Private Attribute)?
在類別(Class)中可以進行存取,而外部無法存取的屬性(Attribute)。使用方式就是在私有屬性(Private Attribute)前加上兩個底線(__),如下範例:
# 部落格類別
class Blog:
def __init__(self):
self.__author = "Mike" # 作者屬性
self.__titles = [] # 文章標題屬性
def __add_post(self, title): # 新增文章
self.__titles.append(title)
blog = Blog()
print(blog.__author)
從範例中可以看到,來源端無法存取到類別中的author及titles私有屬性(Private Attribute)。如果是利用Visual Studio Code來開發Python的話,在來源端物件的IntelliSense清單中就選不到私有屬性(Private Attribute),證明成功將其進行封裝(Encapsulation)。
但是Python不像其他物件導向程式語言真的把屬性(Attribute)或方法(Method)變為私有,事實上來源端還是可以存取得到。Python事實上把加了兩個底線的私有屬性(Private Attribute)重新命名,在前面加上了底線類別名稱,來源端只要透過此名稱還是可以進行存取,如下範例:
blog = Blog()
print(blog._Blog__author) #執行結果為:Mike
所以在類別中的屬性(Attribute)或方法(Method)加上兩個底線(__)主要是告訴來源端此屬性(Attribute)或方法(Method)為私有,避免來源端直接或意外的存取。
Q:什麼是私有方法(Private Method)?
在類別(Class)中可以進行存取,而外部無法存取的方法(Method)。和私有屬性(Private Attribute)作法相同,在私有方法(Private Method)前面加上兩個底線(__),如下範例:
# 部落格類別
class Blog:
def __init__(self):
self.__author = "Mike" # 作者屬性
self.__titles = [] # 文章標題屬性
def __add_post(self, title): # 新增文章
self.__titles.append(title)
blog = Blog()
blog.__add_post("Python tutorials")
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike( https://www.learncodewithmike.com/2020/01/python-encapsulation.html )網站觀看更多精彩內容。
  • OOP
  • Python
  • 物件導向程式設計
拍手 0 留言 0 觀看 63 收藏 0
Mike OOP

Learn Code With Mike品牌創辦人

10/21 21:50

Python繼承(Inheritance)實用教學
Q:如何使用Python繼承?
將共同的屬性(Attribute)或方法(Method)定義在一個類別(Class)中,而其它類別(Class)則透過繼承(Inheritance)的方式來擁有它,如下範例:
class Transportation: # 交通工具
def __init__(self):
self.color = "white"
def drive(self): # 駕駛方法
print("drive method is called.")
class Car(Transportation):
def accelerate(self): # 加速方法
print("accelerate is method called.")
class Airplane(Transportation):
def fly(self): # 飛行方法
print("fly method is called.")
Transportation類別(Class)就叫父類別或基底類別(Base Class),而Car及Airplane類別(Class)就稱為子類別(Sub Class),在類別名稱的地方透過括號的方式來繼承(Inheritance),藉此擁有父類別公開的屬性(Attribute)及方法(Method),如下範例:
mazda = Car()
mazda.drive()
print(mazda.color)
Q:什麼是方法覆寫?
當子類別中定義了和父類別同名的方法(Method),這時候子類別的物件(Object)呼叫這個同名方法時,其中的實作內容將會覆蓋掉父類別的同名方法,這就叫做方法覆寫(Method Overriding),如下範例:
class Transportation: # 交通工具
def drive(self): # 駕駛方法
print("Base class drive method is called.")
class Car(Transportation):
def drive(self):
print("Sub class drive method is called.")
mazda = Car()
mazda.drive()
這時候如果我們想在子類別中執行父類別的方法(Method)時,則可以使用super()內建方法來達成,如下範例:
class Transportation: # 交通工具
def drive(self): # 駕駛方法
print("Base class drive method is called.")
class Car(Transportation):
def drive(self):
super().drive()
print("Sub class drive method is called.")
mazda = Car()
mazda.drive()
Q:什麼是多層繼承?
就是繼承(Inheritance)的層級超過一層以上,如下範例:
class Animal: # 動物類別
pass
class Bird(Animal):
def fly(self):
print("fly")
class Duck(Bird):
pass
duck = Duck()
duck.fly()
Q:什麼是多重繼承?
就是子類別繼承(Inheritance)一個以上的父類別,並且各類別應各司其職,避免有相同的方法,如下範例:
class Animal: # 動物類別
def eat(self):
print("Animal eat method is called.")
class Bird:
def walk(self):
print("Bird walk method is called.")
class Duck(Animal, Bird):
pass
duck = Duck()
duck.eat()
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike( https://www.learncodewithmike.com/2020/01/python-inheritance.html )網站觀看更多精彩內容。
  • Python
  • OOP
  • 物件導向程式設計
拍手 2 留言 0 觀看 54 收藏 0
Mike OOP

Learn Code With Mike品牌創辦人

10/21 21:58

Python多型(Polymorphism)實用教學
Q:什麼是抽象方法(Abstract Method)?
要使用抽像方法(Abstract Method)的類別首先要繼承ABC(Abstract Base Class)類別,接著在抽象方法上方加上@abstractmethod裝飾詞(Decorator),並且不會有實作內容,如下範例:
from abc import ABC, abstractmethod
class Login(ABC): # 登抽象入類別
@abstractmethod
def login(self):
pass
由於抽象方法(Abstract Method)是抽象的,所以只要有抽象方法(Abstract Method)的類別就稱為抽象類別,是無法建立物件的,必須透過繼承(Inheritance)的類別來進行抽象方法(Abstract Method)的實作,如下範例:
from abc import ABC, abstractmethod
class Login(ABC): # 登入抽象類別
@abstractmethod
def login(self):
pass
class FacebookLogin(Login): # Facebook登入機制
def login(self):
print("Facebook login implementation.")
fb = FacebookLogin()
fb.login()
所以,抽象方法(Abstract Method)通常應用於定義各類別的共同介面,讓未來要增加的需求功能,必須遵守共同的規則進行實作,來達到各類別擁有一致性的介面,不但好維護且易於擴充。
Q:什麼是多型(Polymorphism)?
顧名思義,就是同一個介面或方法(Method)可以有多個實作型態。
我們來延伸上面的例子,如果今天應用程式要增加Google及Twitter的登入機制,想必大家應該知道要怎麼做了吧,就是建立各自的類別(Class)繼承(Inheritance)Login抽象類別,接著實作其中的login抽象方法(Abstract Method),如下範例:
from abc import ABC, abstractmethod
class Login(ABC): # 登入抽象類別
@abstractmethod
def login(self):
pass
class FacebookLogin(Login): # Facebook登入機
def login(self):
print("Facebook login implementation.")
class GoogleLogin(Login): #Google登入
def login(self):
print("Google login implementation.")
class TwitterLogin(Login): #Twitter登入
def login(self):
print("Twitter login implementation.")
fb = FacebookLogin()
fb.login()
google = GoogleLogin()
google.login()
twitter = TwitterLogin()
twitter.login()
各位有沒有發現,來源端不同的類別物件(Object)呼叫同樣的方法(Method)時,卻可以有不同的實作方式,這也就是所謂的多型(Polymorphism)。
其中的原理,就是Python編譯器在執行期間(Runtime)看到三個實體類別(Class)皆繼承(Inheritance)了Login抽象類別,接著在物件(Object)呼叫login()方法(Method)時,Python編譯器則依據呼叫物件(Object)的實體類別(Class)來執行相應的類別實作。
Q:使用多型(Polymorphism)有什麼優點?
使用多型(Polymorphism)最大的優點就是易於擴充及降低類別間的相依性。從這兩個例子可以看到,不論未來要再增加新的登入機制或交通工具,都能非常容易的透過新增類別來進行擴充,並且有一致性的介面。
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike( https://www.learncodewithmike.com/2020/01/python-polymorphism.html )網站觀看更多精彩內容。
  • 物件導向程式設計
  • OOP
  • Python
拍手 1 留言 0 觀看 38 收藏 0
Mike OOP

Learn Code With Mike品牌創辦人

10/19 21:53

淺談Python類別(Class)
Q:什麼是類別(Class)?
簡單來說,就是物件(Object)的藍圖(blueprint)。就像要生產一部汽車時,都會有設計圖,藉此可以知道此類汽車會有哪些特性及功能,類別(Class)就類似設計圖,會定義未來產生物件(Object)時所擁有的屬性(Attribute)及方法(Method)。而定義類別的語法如下:
class classname:
  statement
首先會有class關鍵字,接著自定類別名稱,最後加上冒號。類別名稱的命名原則習慣上使用Pascal命名法,也就是每個單字字首大寫,不得使用空白或底線分隔單字,如下範例:
class MyCars:
Q:什麼是物件(Object)?
就是透過類別(Class)實際建立的實體,就像實際生產出來的汽車(例如:Mazda)。類別(Class)與物件(Object)的關係就像汽車設計圖與汽車實體。而建立物件(Object)的語法如下:
object_name = classname()
範例:
mazda = Cars()
Q:什麼是屬性(Attribute)?
負責存放物件(Object)的資料。設定物件(Object)的屬性值語法如下:
object_name.attribute_name = value
範例:
mazda = Cars() # 建立Cars類別的物件
mazda.color = "blue" #顏色屬性
建立物件(Object)後,才可進行屬性值(Attribute)的設定。會建議使用建構式(Constructor)來進行屬性值(Attribute)的設定。而存取物件的屬性值則透過以下語法:
object_name.attribute_name
範例:
print(mazda.color) # 執行結果:blue
Q:什麼是建構式(Constructor)?
於建立物件(Object)的同時,會自動執行的方法(Method)。所以通常我們會在建構式(Constructor)中初始化物件(Object)的屬性值(Attribute)。至少要有一個self參數,之後利用逗號區隔其他屬性,語法如下:
def __init__(self, color, seat):
  self.color = color # 顏色屬性
  self.seat = seat # 座位屬性
而這個self是什麼意思呢?它代表了實體物件的參考,也就是目前的物件(Object)。這個self就是告訴類別(Class)目前是在設定哪一個物件的屬性(Attribute)。所以範例中的意思就是此物件的color屬性等於傳入的color屬性值,此物件的seat屬性等於傳入的seat屬性值,而傳入屬性值的方式就是在建立物件的時候,如下範例:
class Cars:
def __init__(self, color, seat):
self.color = color # 顏色屬性
self.seat = seat # 座位屬性
mazda = Cars("blue", 4)
範例中於建立mazda物件(Object)的同時,生成其屬性並且初始化屬性值(color和seat)。
Q:什麼是方法(Method)?
可以想像是物件(Object)的行為。定義方法(Method)和函式(Function)的語法很像,都是def關鍵字開頭,接著自訂名稱,但是方法(Method)和建構式(Constructor)一樣至少要有一個self參數,語法如下:
def method_name(self):
  statement
範例:
class Cars:
def __init__(self, color, seat):
self.color = color # 顏色屬性
self.seat = seat # 座位屬性
# 方法(Method)
def drive(self):
print(f"My car is {self.color} and has {self.seat} seats.")
mazda = Cars("blue", 4)
mazda.drive() #執行結果:My car is blue and has 4 seats.
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike( https://www.learncodewithmike.com/2020/01/python-class.html )網站觀看更多精彩內容。
  • 物件導向程式設計
  • Python
  • OOP
拍手 2 留言 0 觀看 57 收藏 1
Mike OOP

Learn Code With Mike品牌創辦人

10/20 21:27

3個必須瞭解的Python屬性觀念
Q:什麼是實體屬性(Instance Attribute)?
需伴隨物件(Object)的生成來建立,也就是透過點(.)的語法或在建構式(Constructor)中所生成的屬性(Attribute)。各物件(Object)的實體屬性(Instance Attribute)各自獨立,修改某一個物件(Object)的實體屬性(Instance Attribute)值時,不會影響到其他物件。如下範例:
class Cars:
pass
mazda = Cars()
mazda.color = "blue"
toyota = Cars()
toyota.color = "red"
print("mazda color: ", mazda.color)
print("toyota color: ", toyota.color)
接下來我們來看透過建構式(Constructor)所建立的屬性(Attribute):
class Cars:
# 建構式
def __init__(self, color, seat):
self.color = color
self.seat = seat
self.weight = 140
mazda = Cars("blue", 4)
mazda.color = "yellow"
mazda.seat = 8
mazda.weight = 200
print("mazda color: ", mazda.color)
print("mazda seat: ", mazda.seat)
print("mazda weight: ", mazda.weight)
Q:什麼是類別屬性(Class Attribute)?
定義在類別層級的屬性(Attribute),也就是在建構式(Constructor)之外的屬性(Attribute)。可以不需要建立物件(Object),直接透過類別名稱存取。各物件共享類別屬性(Class Attribute)值,也就是說當我們修改類別屬性(Class Attribute)值時,每一個透過此類別(Class)所建立的物件(Object),都會受到影響。如下範例:
class Cars:
door = 4
# 建構式
def __init__(self, color, seat):
self.color = color
self.seat = seat
self.weight = 140
mazda = Cars("blue", 4)
print("mazda original door: ", mazda.door)
Cars.door = 6
print("mazda new door: ", mazda.door)
Q:什麼是屬性(Property)?
是一個允許我們設定及取得屬性(Attribute)值的物件(Object),當我們想要對類別(Class)中的屬性(Attribute)有更多的控制時,就會使用Python的屬性(Property)來達成。如下範例:
class Cars:
# 建構式
def __init__(self, weight):
self.weight = weight
@property
def weight(self):
return self.__weight
@weight.setter
def weight(self, value):
if value <= 0:
raise ValueError("Car weight cannot be 0 or less.")
self.__weight = value
在讀取屬性(Attribute)的方法上方加上@property Decorator,並且將方法名稱修改為weight,這個weight就是屬性(Property)。接著在設定屬性(Attribute)的方法上方加上@property.setter,也就是@weight.setter,意思就是告訴類別(Class)當來源端要設定屬性(Property)值時,要呼叫這個方法(Method)。
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike( https://www.learncodewithmike.com/2020/01/python-attribute.html )網站觀看更多精彩內容。
  • 物件導向程式設計
  • OOP
  • Python
拍手 2 留言 0 觀看 32 收藏 0
Mike OOP

Learn Code With Mike品牌創辦人

10/20 21:39

解析Python物件導向設計的3種類型方法
Q:什麼是實體方法(Instance Method)?
Python類別(Class)中沒有加任何裝飾詞(Decorator)的方法(Method),至少要有一個self參數,於方法(Method)被呼叫時指向物件(Object),其後可以依需求增加額外參數,如下範例:
class Cars:
def drive(self):
print("Drive is instance method.")
實體方法(Instance Method)透過self參數可以自由的存取物件(Object)的屬性(Attribute)及其他方法(Method),藉此來改變物件(Object)的狀態,如下範例:
class Cars:
# 建構式
def __init__(self):
self.color = "blue"
def drive(self):
print(f"{self} is {self.color}.")
self.message()
def message(self):
print("Message method is called.")
mazda = Cars()
mazda.drive()
Q:什麼是類別方法(Class Method)?
Python類別(Class)中有@classmethod裝飾詞(Decorator)的方法(Method),被呼叫時,相較於實體方法(Instance Method)的self參數指向物件(Object),類別方法(Class Method)為cls參數,指向類別(Class),如下範例:
class Cars:
# 類別方法(Class Method)
@classmethod
def open_door(cls):
print("Open door is class method.")
由於類別方法(Class Method)的cls參數指向類別(Class),所以類別方法(Class Method)僅能改變類別的狀態,而無法改變物件(Object)的狀態,因為它沒有self參數可以存取物件的屬性(Attribute)及方法(Method)。如下範例:
class Cars:
door = 4
# 類別方法(Class Method)
@classmethod
def open_door(cls):
print(f"{cls} has {cls.door} doors.")
mazda = Cars()
mazda.open_door()
Cars.open_door()
Q:什麼是靜態方法(Static Method)?
Python類別中有@staticmethod裝飾詞(Decorator)的方法(Method),可以接受任意的參數,也因為它沒有self及cls參數,所以靜態方法(Static Method)無法改變類別(Class)及物件(Object)的狀態,如下範例:
class Cars:
#靜態方法
@staticmethod
def accelerate():
print("Accelerate is static method.")
靜態方法(Static Method)在類別(Class)中是一個獨立的方法(Method),通常應用於方法(Method)中無需存取物件(Object)的屬性(Attribute)或方法(Method),單純執行傳入參數或功能上運算的情況,如下範例:
class Cars:
# 速率靜態方法
@staticmethod
def speed_rate(distance, minute):
return distance / minute
van = Cars()
van_rate = van.speed_rate(10000, 20)
print("van rate: ", van_rate)
sports_car_rate = Cars.speed_rate(20000, 20)
print("sports car rate: ", sports_car_rate)
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike( https://www.learncodewithmike.com/2020/01/python-method.html )網站觀看更多精彩內容。
  • 物件導向程式設計
  • OOP
  • Python
拍手 2 留言 0 觀看 39 收藏 1
工作機會

軟體設計工程師(高雄)

光子網絡科技有限公司

高雄市前鎮區 3年以上 大學

月薪 35,000~100,000元

ASP.NET程式設計師

美商艾必威科技有限公司台灣辦事處

新北市土城區 經歷不拘 專科

待遇面議