前言
HI大家好😁,我是Noel,今天想來跟大家分享一下,從python新手邁向下一階段時一定會碰到的觀念物件導向OOP(Object Oriented Programing); 我個人學到這邊都覺得這邊的觀念真的有夠抽象跟全新名詞真是有夠多甚麼物件(object)啦甚麼屬性(attribute)啦甚麼方法(method)啦,一堆怪怪的名詞,然後很多過來人又說很重要,學起來有點虛無飄渺(我自己的感覺...),因此我想要出一系列文章來用班級,教育部,升學這些概念來形象化這邊的內容,結果意外的蠻契合,希望一系列文章能幫助正在學習的大家理解OOP的概念。
先來看個簡單的案例
print(type(1))
print(type(1.0))
print(type({}))
----------------------output------------------------
<class 'int'>
<class 'float'>
<class 'dict'>
結果可以看到,class早在我們學習變數時跟資料型態,就已經存在了,原來資料型態本身就是一種class,那究竟class是甚麼? 至於type是甚麼,等我們未來談到metaclass的時候會細談。
用班級理解class
中文有人叫類,但其實我們可以簡單用字面上理解,class就是一個班級,裡面有很多小朋友,有小朋友,老師就給小朋友做事情(methods),而且這個班級有共同資產(attributes),而我們產生出來的實例(instances)就是小朋友們努力完成的作品,至於為什麼這樣比喻呢,用程式碼舉例一下,讓大家更清楚:
class MusicClass: # 音樂班
def __init__(self): #特殊小朋友
self.fee = 1000
self.instruments = ['trumpet','piano']
def play_piano(self): # 叫小朋友彈鋼琴
if 'piano' in self.instruments:
print(f'I am playing {self.instruments[1]},and this piano belongs to {self.__class__.__name__}')
def play_fluet(self): # 叫小朋友
if self.fee> 200:
self.fee -= 200
print(f"I asked for reimbursement of the fee")
print(f'now {self.fee} left')
MusicClass().play_fluet() # 叫小朋友做事情
print('-'*20)
MusicClass().play_piano() # 叫小朋友做事情
------------------------output------------------------------------
I asked for reimbursement of the fee
now 800 left
--------------------
I am playing piano,and this piano belongs to MusicClass
上面的程式碼表示,我們創立了一個音樂班(MusicClass),接著我們又招生幾位小朋友,這時老師就來想想要讓小朋友做些甚麼事情了~,老師決定要先讓些小朋友來彈鋼琴(play_piano(self)),一些來吹笛子(play_fluet(self)),但是他們都是從0開始沒有樂器,也因為他們都在音樂班底下,所以都有權利可以使用樂器(self.instruments),不然就是利用公費(self.fee)報銷買樂器,而我們利用了創立實例(MusicClass())讓小朋友能夠上場表演。
神奇的self
因此可以分析出來,class就是把一群有相似特色的小朋友召集再一起,並且這段程式最酷的特色就是這個self了,他讓小朋友們可以不用傳參數就可以使用班上的資源(attributes),而且self還可以讓小朋友們一起表演交響樂:
class MusicClass: # 音樂班
def play_piano(self): # 彈鋼琴小朋友
print('si','la','so~~')
def play_fluet(self): # 吹笛小朋友
print('do','si','so')
def play_symphony(self):# 讓多位小朋友來表現一下
[
self.play_fluet(),
self.play_piano(),
self.play_fluet(),
]
MusicClass().play_symphony() #照著旋律順序來表演
------------------------output------------------------------------
do si so~~
si la so~
do si so~~
這個案例,看出來我們小朋友合作無間,透過self我們能在這個班級裡面很彈性的調動, mothods以及attributes這些資源,而且都非常方便管理,前提是這些都要有關聯性,例如明明是音樂班突然放進來一個畫畫的動作,但應該不會讓音樂班小朋友丟美術作品出去比賽,有點奇怪(不是不行,但是老師應該不會這樣安排)。
結論
class班級可以輕鬆管理做事的人跟動作(methods),跟一些共同資產集(attributes)集合起來
self可以讓這個班級有效率的調度人力跟資源
因此回到開頭,其實string,float,dictionary...這些都是python已經內建寫好的class,跟我們自己寫的class類似也是包了很多同性質小朋友在裡面做事情,至於上面還有讓小朋友有特別行為__init__這次沒有細談,我們就留到下篇文章dunder method再來說。😀
很棒的分享~ 另外我有個疑問想問同學😀, 假設招生兩位小朋友想吹笛子或更多呢?
用 method 來當作招生新的小朋友會不會變得有點邏輯怪怪的呢,
像在 def play_symphony 裡是同一位小朋友吹笛呢 還是兩位小朋友?
要以你的範例的話會比較建議 把 method 當作小朋友會的技能
就好比我今天有兩個字串,
我想分別做大小寫的轉換是不是就是要先宣告兩個 string 物件
Ex: str_1 = 'Tom', str_2 = 'Amy'
str_1.upper()
str_2.lower()
這樣應該就比較容易看出兩者在OOP實作上的差異性唷