Photo by Bram Naus on Unsplash
在學習程式語言時,或多或少都有聽過物件導向程式設計(Object-oriented
programming,簡稱OOP),它是一個具有物件(Object)概念的開發方式,能夠提高軟體的重用性、擴充性及維護性,在開發大型的應用程式時更是被廣為使用,所以在現今多數的程式語言都有此種開發方式,Python當然也不例外。而要使用物件導向程式設計就必須對類別(Class)及物件(Object)等有一些基本的了解,包含了:- 類別(Class)
- 物件(Object)
- 屬性(Attribute)
- 建構式(Constructor)
- 方法(Method)
我們先來看一下今天要來建立的類別:
# 汽車類別
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 {self.seat} seats.")
接下來就針對類別(Class)各個部分來進行介紹。
一、類別(Class)
簡單來說,就是物件(Object)的藍圖(blueprint)。就像要生產一部汽車時,都會有設計圖,藉此可以知道此類汽車會有哪些特性及功能,類別(Class)就類似設計圖,會定義未來產生物件(Object)時所擁有的屬性(Attribute)及方法(Method)。而定義類別的語法如下:
class classname:
statement
首先會有class關鍵字,接著自定類別名稱,最後加上冒號。類別名稱的命名原則習慣上使用Pascal命名法,也就是每個單字字首大寫,不得使用空白或底線分隔單字,如下範例:
#範例一
class Cars:
#範例二
class MyCars:
二、物件(Object)
就是透過類別(Class)實際建立的實體,就像實際生產出來的汽車(例如:Mazda)。類別(Class)與物件(Object)的關係就像汽車設計圖與汽車實體。而建立物件(Object)的語法如下:
object_name = classname()
範例:
mazda = Cars()
範例中的mazda即是Cars類別(Class)的物件(Object)。Python也提供了一個函式isinstance()來判斷類別(Class)與物件(Object)的關係,語法如下:
isinstance(object_name, class_name)
範例:
# 汽車類別
class Cars:
pass
# 摩托車類別
class Motorcycle:
pass
# 建立Cars類別的物件
mazda = Cars()
print(isinstance(mazda, Cars)) # 執行結果:True
print(isinstance(mazda, Motorcycle)) # 執行結果:False
第15行由於mazda並不是Motorcycle的物件(Object),所以執行結果為False。
三、屬性(Attribute)
負責存放物件(Object)的資料。設定物件(Object)的屬性值語法如下:
object_name.attribute_name = value
範例:
mazda = Cars() # 建立Cars類別的物件
mazda.color = "blue" #顏色屬性
mazda.seat = 4 #座位屬性
從範例中可以看到,建立物件(Object)後,才可進行屬性值(Attribute)的設定。但是這種寫法當有很多屬性需進行設定時,會顯得沒有效率,所以會建議使用建構式(Constructor)來進行屬性值(Attribute)的設定,於文章第四節會來跟大家說明。而存取物件的屬性值則透過以下語法:
object_name.attribute_name
範例:
print(mazda.color) # 執行結果:blue
print(mazda.seat) # 執行結果:4
四、建構式(Constructor)
# 建構式
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)。你一定會想說奇怪,建構式(Constructor)的參數有三個,為什麼我們只有傳入兩個?因為第一個self參數,Python編譯器會幫我們把目前物件的參考(mazda)傳給建構式(Constructor),所以我們就不需要多此一舉傳入物件。五、方法(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.
方法(Method)的self參數同樣是代表目前的物件(mazda),在呼叫時Python編譯器會自動幫我們傳入。方法(Method)中透過self.color及self.seat的方式來存取目前物件(mazda)的color和seat屬性值,並且印出結果。
六、小結
以上就是Python類別(Class)的基本觀念介紹,希望透過此文章,可以大致瞭解整個Python類別(Class)的架構,並且有能力建立屬於自己的類別(Class)。當然其中的屬性(Attribute)又可分為:
- 實體屬性(Instance Attribute)
- 類別屬性(Class Attribute)
而方法(Method)也可分為:
- 實體方法(Instance Method)
- 類別方法(Class Method)
- 靜態方法(Static Method)
未來將會各別撰寫相關文章來詳細介紹。在練習的過程中若有碰到任何問題或說明不清楚的地方,歡迎留言與我分享!
如果您喜歡我的文章,請幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
如果您喜歡我的文章,請幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
有想要看的教學內容嗎?歡迎利用以下的Google表單讓我知道,將有機會成為教學文章,分享給大家😊
我看完這篇終於理解,簡單明瞭,越來越喜歡您的文章,加油~~
回覆刪除感謝您的支持 :)
刪除請問一下
回覆刪除第五節第二個範例裡
print(f"My car is {self.color} and has {self.seat} seats.")
那個f的意思是...?
最後感謝老師的文章 非常好理解!!
Python的format-string(字串格式化)用法,可以參考我寫的「Python字串介紹」文章第二節的字串格式化。 文章連結有附在本文的「你可能有興趣的文章」中。
刪除感謝您的支持 :)
請問在建構式中, _init_是什麼意思? 可以用 Cars取代嗎?
回覆刪除def _init_(self, color, seat):
Ray您好:
刪除不能像其它的程式語言一樣使用和類別同名的方式來定義Python建構式,也就是不能使用Cars取代,__init__就是Python程式語言中,建構式的定義方式,用來初始化物件的狀態。希望以上有解答您的疑問 :)
Thx
刪除看過很多的網頁,您的教學字體清楚、範例簡潔,造福了我們這些程式新手,跟之前我入手python看澎澎老師的影片一樣,都是很好的教學內容,期望能有更多的內容能分享給我們,加油! !
回覆刪除馬可高 您好:
刪除真的非常感謝您的鼓勵與支持,會持續撰寫教學文章分享給大家的,期望這樣的內容能幫助到正在學習的讀者們,謝謝您 :)
感謝教學 對於菜逼吧的本人是一大福音 期待出來更多好作品
回覆刪除p.s. 我的問題剛好樓上上上有人問了 就純發感謝瞜
不用客氣,也謝謝您的支持,未來會持續分享好文給大家的 :)
刪除看了你教學才分清楚物件與類別的關係,比市面上的python中譯本好太多了.
回覆刪除小弟目前python菜雞,希望有朝一日能學成對付那些海量的資料
ytma您好,感謝您的支持鼓勵,一定可以學成的,一起加油吧 :)
刪除您好,
回覆刪除我想請問一下,封包和類別的差異,感覺類別能做到,封包也能做,所以想了解一下差異,謝謝
您好,請問是想瞭解「封裝」和「類別」的差異嗎? 簡單來說,「封裝」可以想像成是「類別」中,用來控制屬性或方法的權限,什麼樣的屬性或方法要對外開放,什麼樣的屬性或方法不對外開放,來達到「類別」中,屬性或方法的存取控制。
刪除「封裝」的相關概念可以參考以下文章:
https://www.learncodewithmike.com/2020/01/python-encapsulation.html
希望有解答您的疑惑 :)
謝謝您 👍
刪除真的很棒!
回覆刪除pocketman您好,感謝支持鼓勵阿 :)
刪除網路上搜尋class的說明,被各種名詞弄得越看越頭昏,結果看到你的說明簡潔、具體、易懂,真是太棒了!非常感謝你!
回覆刪除您好,感謝您的鼓勵,非常開心能夠幫助到您,讓我有動力繼續分享更多的教學給大家,歡迎分享給身邊有在學習Python朋友唷 :)
刪除非常感謝
回覆刪除非常清楚!!!
回覆刪除謝謝您簡潔、具體、易懂的說明!對初學者來說真的是救星!網路上太多的文章的用字遣詞都太艱深 > <
回覆刪除太感謝Mike了~~
回覆刪除受益良多!!!
不好意思我想問 self.color = color
回覆刪除self.seat = seat
為什要這麼做呢? 有甚麼原因嗎?
self.color 物件成員
刪除color 參數
Mike老師 有你真好
回覆刪除感謝您的分享與說明,受益良多!
回覆刪除