物件導向全名為(Object Oriented Programming),屬於一種概念,將現實世界實體(如汽車、使用者)模擬為軟體「物件」的程式設計方法,能夠提高軟體的重用性、擴充性及維護性,在開發大型的應用程式時更是被廣為使用,因此很多語言都很常使用,像是Java、C++、PHP等等,還有本次介紹物件導向使用的語言 -- Python,在Python中所有東西都是一個物件,接下來的系列將會介紹物件導向的四大本柱 : 封裝、繼承、多型與抽象。
甚麼是物件
用一個例子讓大家更快速的了解物件,以一台車子來說,我們都會知道他的品牌、車身顏色、排氣量與車身識別碼等等,這些特徵就是這台車的屬性,而車子能夠前進與後退等等行爲就是方法,每台車幾乎都有以上的特徵與行為,不過在屬性上會有一些差異性,有可能顏色品牌一樣,但總不可能每台車的車身識別碼都一樣吧😂。
所以同一個類別中的所有實例(instance)具有屬性的差異性以及行為的一致性。
舉完例子後,相信大家對於物件有了一定的認識,接下來就開始介紹如何實作吧~
類別 class
建立一個物件
要建立一個物件要使用 class 關鍵字建立一個類別,並為他取一個名字,加在 class 關鍵字
空格的右邊。
class的語法
class car:
pass
car_1 = car()#建立一個空類別
print(type(car_1))#輸出<class '__main__.car'>
用 type() 函式看看剛剛建立的car_1物件是什麼資料型態,
結果是<class '__main__.car'>,表示他確實是一個物件,只是裡面是空的,目前還沒有什麼用途。
初始化
在python的物件導向中,初始化函式 __init__ 是一個非常重要的概念(可以用initialize這個單字來記),用於設定物件的初始屬性,當類別被實例化時,該方法會自動執行,其中 self 為必填,且必須放在第一位,該參數代表著物件本身,需特別注意的是該函式不回傳任何值,所以不能使用 return。
class car:
def __init__(self):
self.brand = "Toyota"
self.color = "yellow"
def forward(self):
print("P檔")
car_1 = car()
print(car_1.brand)
除了固定的初始值設定,也可以接收任意數量參數,進行自訂的屬性初始值設定,因此也被稱為在其他語言常聽見的建構子(Constructor)。
class car:
def __init__(self, fuel_capacity):
self.brand = "Toyota"
self.color = "yellow"
self.fuel_capacity = fuel_capacity
def forward(self):
print("D檔")
def refuel(self, liter):
if(self.fuel_capacity == 100):
print("you don't need to refuel")
elif(self.fuel_capacity+liter > 100):
print("your liter is too much")
else:
self.fuel_capacity += liter
print("success")
car_1 = car(50)
print(car_1.brand) #輸出 Toyota
car_1.refuel(20) #輸出 success
print(car_1.fuel_capacity)#輸出 70
car_1.refuel(30) #輸出 success
car_1.refuel(30) #輸出 you dont need to refuel
解構子
有建構子當然也就會有解構子(Destructor),在Python 的解構子(Destructor)使用 __del__ 函式,搭配 del 指令,或是指定這個物件為 None 就可以將物件刪除,在物件即將被垃圾回收(引用計數歸零)時自動調用。
class car:
def __init__(self, fuel_capacity):
self.brand = "Toyota"
self.color = "yellow"
self.fuel_capacity = fuel_capacity
def forward(self):
print("P檔")
def refuel(self, liter):
if(self.fuel_capacity == 100):
print("you dont need to refuel")
elif(self.fuel_capacity+liter > 100):
print("your liter is to much")
else:
self.fuel_capacity += liter
print("success")
def __del__(self):
print(f"這台 {self.brand} 已經被回收銷毀了。")
car_1 = car(50)
print(car_1.brand) #輸出 Toyota
car_1.refuel(20) #輸出 success
print(car_1.fuel_capacity)#輸出 70
car_1.refuel(30) #輸出 success
car_1.refuel(30) #輸出 you dont need to refuel
del car_1 #輸出 這台 Toyota 已經被回收銷毀了。
不知道大家有沒有發現在初始化的地方也有提到一個 __init__() 會發現到兩者有一個共同點就是前後都有雙底線,在python這被稱為魔法方法(Magic methods),是一個特殊方法,能夠自訂類別的行為並且會在特定的情況下自動呼叫它們,提供了更多的靈活性和功能,當然不是只有這兩種,像是__str__()、__len__() 與 __call__() 等等,由於主題的關係,在該篇不做演示其所有用法,有興趣的讀者可以參考官方文檔或者是其他網路文章,之後小弟有機會會再好好地介紹。
本篇文章到這裡就結束了,也是第一次嘗試開啟程式類第二個系列的的文章,如果喜歡我的文章或覺得有用的話,歡迎動動手指點擊愛心,你/妳的支持是我最大的動力,我們下篇文章見🙌。