好,那麼呢我們現在就可以來看一下,我們既然有剛剛那個
program,而且我們感覺它呢寫的不夠好,那我們來看看 class 可以幫我們什麼忙。
今天呢,class 這種東西呀,類別就是所謂的 self-defined
data types,也就是自定的資料形態, 因此就是說我們要來自己 define 我們要用的資料形態。
那我們之前用過的像是字元啦,整數啦,浮點數啦,Boolean 啊之類的,非常的基本,或者是
composite data type,像是字串啦,list 啦,tuple,dictionary
等等, 它一個東西裡面包了好幾個東西。
那 今天我們要 define 的 class 呢,當然性質上比較像第二種, 也就是說,比如說待會我們要 define 一個
type 叫做 date, date 裡面呢就會有好幾個東西,會有年月日之類的,那我們的任務
大概就是要在各種不同的應用裡面,define 各式各樣我們自己要用的資料形態。
那麼在 Python 裡面呢,我們自定的資料形態叫做 class,
在現代大部分的程式語言裡面呢都是叫 class,不過也有一些不是的,
所以我們,總之大家知道它們的概念是相通的,它們都是自定資料形態,只是在 Python
裡面以及大部分 的語言,我們說我們要自定一個 class,自定一個 class 以後,這個 class
就會變成一個形態, 那形態可以用來生出變數嘛,比如說我可以有整數變數,我可以有小數變數,等等。
用 class 生出來的物件我們就特別給它一個名字叫做物件,叫做
objects, 所以一般呢,我們 in general 都叫生出來的東西叫做變數,
那麼用 class 生出來的變數我們叫它 object, 叫它物件。
每一個物件呢,我們在裡面會有一些 attribute,也就是所謂的屬性,那麼
我們今天會仔細地介紹,屬性有兩種,稱為 instance
variable 跟 static variables, 那麼它們呢都是所謂的
member,那我們等一下會先介紹 instance variable,
它就是每一個物件本身會有的一些屬性,static variables 等到最後的時候呢再來作介紹。
好,那我們廢話不多說,馬上就來看一下我們要做什麼。
今天如果我要 define 一個 class,我要使用的事情就是使用我們 的
keyword 就叫做 class,所以呢當我要宣告一個 形態,叫做
date 的時候,我的語法長得像這個樣子,大家可以看到它跟 define 一個這個
function 有點像, define function 的時候我們寫 def,然後後面寫一個
function 的 名稱,括號裡面看有沒有這個我們需要的這個變數,
或者是 perimeter,打個冒號,底下寫一些跟這個 function 有關的東西。
那我們現在呢寫一個 class,class 的名稱, 打個冒號,裡面寫我們在 class 裡面需要的東西。
那有趣的是呢,此刻我們並不需要任何東西, 所以我們現在要寫的是一句話叫做
pass,pass 這個東西也是一個 Python 的關鍵字,
它寫下去呢就幹嘛,表示你不做任何事情,就 pass,很像玩撲克牌的時候你說 pass,沒事做。
那我們今天在這裡為什麼沒事做,等一下就會很清楚,我們等一下會有許多不同的 operation,
它們會把這個 date 裡面加東西進去,所以此刻因為還沒有加,所以現在是 pass。
那麼 in general 呢,通常我們寫 class 不會真的寫一個這麼空的,這只是一開始示範用的而已。
那今天課程結束的時候你會發現,寫 class 通常一開始裡面就會有東西了,待會兒再說。
好,那麼我們今天呢,一旦有了一個 date 這個形態了以後,我們就可以用它來
宣告物件,那麼它的語法很像我們在宣告 list,tuple
啊之類的東西一樣, 就是呢,我有一個形態叫 date,我就用它來宣告一個物件,比如說叫做
d,所以我 create 一個 d,它一開始是什麼不知道,但是它是一個
date,這裡要放一個圓括號,那原因是什麼,待會兒會遇到, 所以呢你現在先記著就好了。
一旦有了這個以後,我們之後呢就會使用所謂的 dot operator
來存取這樣的一個 object 裡面的 member, 那我們這裡提的 member 呢當然就是所謂的
instance variable 啦, 那現在是什麼,這個到底是什麼你還不是很清楚,不過呢你可以想象一下我們會幹嘛,假設
這裡有一個 date,那麼 date 這個物件 d,d
裡面的東西,我們就 打一個點,它呢就會讓我們存取它裡面的東西,一個日期裡面可能含有
month, 可能含有 day,可能含有別的東西,那麼呢我們今天就可以把它們
print 出來,那特別有趣的事情是, 如果你嘗試去 print(d)
的話,你會看到什麼呢? 大家有興趣可以試一下,你會看到一串基本上看不太懂的字,
那個呢其實就是在講說,我們這裡有一個 object,那 object
是程式 設計師自己 define 的,他如果沒有特別講這個 object 要怎麼樣地被印出來的話,
那 Python 的直譯器當然不知道要印什麼,所以它會印給你看,這裡有一個 object,形態是什麼,以及它
的記憶體存在什麼地方,那大體上來說,對我們來說是沒有什麼用啦,但我們就是可以感受一- 下說,這裡有一個 object。
好,那麼我們今天呢有 object 以後,如我們 剛剛所見的,一開始這個
object 裡面是空的,一開始沒有東西, 所以我們要來加 attribute,怎麼加
attribute 呢?方法很簡單, 就是我們 create 了一個 object
以後,我就說,我現在想要幫它加一個 attribute 叫做 month,
我就 d.month, 然後就 assign 一個 value 給它,比如說 12,
那這個 d.month 就會被製造出來,它就像是一個整數一樣,
因為我們 assign 整數給它,它就是一個整數,d.day
就是另一個整數,那麼這兩個值呢 自然就可以被印出來,你就會看到它們是,哦,12
跟 31 這個樣子,那今天我們這麼做, 在這裡寫
d.,d.,d.,如果我們不寫的話會怎麼樣?不會怎麼樣,我們就會 create
一個變數叫 month, 一個變數叫 day,它們就是非常 typical 的整數,對吧?
但是今天呢,我們在前面加上 d.,d.,就表示說, 這個 month
是 d 這個 object 裡面的 month,這個 day
是 d 這個 object 裡面的 day,就有一種把文件放進資料夾這樣子包起來的感覺。
那這個當然就很有用啦,有用的點在於,比如說東西既然被
包成一包,你就可以把這一包東西直接拿給別人,或是直接傳進一個函數,
或是直接對它做一些存取或是運算,那就會比你把一堆零散
的這個整數啊,小數變數之類的拿來做運算方便的多,等一下會看到。
那麼 object 呢,它們如果是同一個這個
類別的話,它們其實是可以有不同的變數組合的。
比如說我這裡 create 另一個叫 d2 好了,d2 這個東西假設也有 day,假設也是
31 吧,我可以幫 d2 再 create 一個 weekday,我說它的值是
Mon,那這個情況下呢 weekday 這個東西 就是一個字串,那換句話說啊,當我們這樣用的時候,那個感覺很像
你面前有好多個空的資料夾,A 資料夾裡面你就放了幾張文件,B
資料夾裡面你就放了另外幾張 文件,而且這些文件的屬性或者是名稱還不盡相同,所以以這一段程式碼來說的話,
上面這個 d 有兩個屬性,分別是 month 跟 day,下面這個
d2 有兩個屬性,分別是 day 跟 weekday,所以你是有這個彈性可以這麼做的。
不過呢,我們要提醒你一下,請你原則上呢是不要這麼做,因為我們今天既然說我們要 create
一種叫做 date 的東西,必然是我們對這個東西有一些想象,一個
date 要有日、 月、 年, 也許就到此為止,也許還要 define 別的東西。
若是如此的話,對於一個程式 裡面,同樣類別的物件,它們理論上應該要擁有一樣的屬性,
就像每一個人都應該要有名字,要有性別,要有身高,要有
體重,等等,不應該有的人有這個,而有的人沒有那個,那他們就不應該是同一個類別。
所以原則上呢,原則上呢,我們待會會寫的這個練習,或者是範例,
都不會發生我們這一頁寫的這個情況,我們會保證,或者我們自己會限制我們自己,同一個類別
生出來的物件,它們應該要擁有一樣的屬性。
這樣才是比較合理的設計,才不會搞混你自己啦,好。
所以今天 class 和 object 可以幫上我們什麼忙呢?最明顯的就是它可以
幫我們做某種像是把東西塞進文件夾的這種資料處理,或者是 資料包裹的動作,也就是說我們可以
group multiple variables into one variable,對吧? 那這裡的每一個
variable 都有它自己的 variable name,所以跟以前不太一樣,以前我如果宣告了一個
list, 然後把東西塞進去,宣告一個 list 是什麼 3,4,5 之類的,
它也是把 multiple variables group into one variable,對吧?
但是呢,它,它,它,它們本人是沒有名字的, 你必須要記住第
0 個存的是 year,第 1 個存的是 month,以此類推,
你記錯,程式自然就寫錯,或是,你會讓你的程式變得比較沒有彈性,因為你每次都要存取- 第一個,
第八個,第四個,第五個,那萬一有一天這個 list 必須要伸長縮短的話,你就很麻煩,所以這是一件事情。
那所以呢,回想一下我們剛剛的這個 library,這個我們的 birthday
的 dictionary, 這個例子里呀,我們之前的 option 1 是說,不如我們存
3 個 dictionary,這個實在太麻煩了, option 2 是說我們用 1
個 dictionary,但是裡面的 3 個整數我們是用一個 3 dimensional
的 list,那就會出現我們剛剛說的問題,你必須要記住誰是誰, 所以我們有一個 option
3,option 3 就是我們今天要做的事情,就是我有一個 dictionary,它的
key 一樣是 name, 而 value 呢將會是所謂的一個 birthday,這個
birthday 的形態是一個 date,所以讓我們來試著用
date 這個概念來重寫一下我們剛剛的 program,讓你有更具體的理解。