前言:
python 最大的特性就是「萬物皆物件」。在理解之前,先來快速的認識物件是什麼?
閱讀時間:10 分鐘

物件
什麼是物件?在說明物件之前。先來一個小活動。
想像你是一個獵人,與你的夥伴們正在大草原上狩獵。突然,走在最前面的你看到遠方有隻野豬,接著你要告訴你的夥伴,你會怎麼做呢?
是不是會去描述野豬的方向、顏色、大小、以及與你們的距離,如果你是個更加專業的獵人,還會補充野豬的行為。
於是你們之間整理一些資訊:
- 名稱 : 野豬
- 方向 : 東南方
- 顏色 : 偏黑
- 行為:休息
- 大小:幼小
因為野豬還太小隻,沒辦法做為很好的糧食,於是你們決定要將牠豢養起來。那麼養野豬就會希望牠聽話,給水喝水,給食物就吃。所以你們又整理了以下的資訊:
- 給食物吃 –> 大小增加
- 給水洗澡 –> 顏色變淺
- 關進籠子 –> 睡覺
最後,野豬健康的長大了,你跟你的小夥伴也吃了豐盛的大餐。同時我的物件也講完了。
蛤?物件講完了?什麼時候???
其實野豬就是物件。程式裡的物件有兩個主要的東西,也就是「屬性」以及「方法」,不過我個人更喜歡將方法想成策略。
屬性就像是描述野豬的形容詞,是屬於野豬的資料。
方法則是野豬的能夠提供的行為,通常會與物件的資料有關。
那麼我們就直接來看範例:

有一些不成文的規定是通常會將屬性寫在前,方法寫在後。這個豬豬物件裡單純以程式來看的話,有3個屬性及2個方法。
想要使用屬性只要在物件之後使用「.屬性名稱」就可以了,「.」可以視為中文的「的」,上面的例子就是 pp.name -> pp的名字(是pp)。
方法其實是一種函數(關於函數未來會再說明),函數裡的 self,其實就表示物件豬豬本身。所以函數 eating() 裡的 self.size,就會得到屬性 size 的資料。而使用方法的方式與使用屬性的方式一樣,不過要加上()。
想要使用物件,就必須先建立物件?什麼是建立物件?
看到第13行,變數=物件名稱(),這就是建立物件。在第13行執行之前,第1-11行只是程式,並沒有實質的資料,建立物件之後,才有真正的空間綁定豬豬物件的資料。
方法存在一些特殊的存在,例如上面使用的第一個方法 __init__,它表示了 initiation (初始化),在建立物件時,會同時執行。那麼簡單詳解第13行的程式流程:
- 建立一個空間,該空間使用資料型態 – object( Pig )
- 找到物件 Pig 的程式 (第1-11行,開始建立實質資料)
- 賦值物件 Pig 的屬性,並建立方法
- 開始執行 __init__ (),init 表示需要增加 name 屬性
- 增加屬性 name 屬性,建立後的物件擁有4個屬性
- 物件建立完畢,放入空間,並貼上 pp 標籤
我們了解了物件的建立,以及如何使用物件的屬性與方法。
那接著來看看為什麼 python 是一個萬物皆物件的語言。
萬物皆物件
萬物皆物件,顧名思義可以認為 python 裡所有的東西都是物件,但真的是這樣嗎?
這個說法還是要稍微打個問號的,但是實際上真的可以這樣認為。因為我們常使用的所有的資料型別,都是物件的衍伸,即便是上一章提到的基礎型別(int、float、bool)也都是物件。那為什麼又存在否定的情況呢?因為函數(函式)無法是物件,關於函數未來會再進行說明。
如果點開 python 的官方文件(內建應用說明文件),就會看到有的解釋沒有物件(class)的標示,這些幾乎都是函式。有趣的是,物件的使用跟函式的使用幾乎一樣,也因此如果認為函式是物件的變形,那麼萬物皆物件就說得通了。
思考:為什麼需要物件這個型別?與其他型別不同在哪?
之前曾經說明過,每個資料都有屬於自己的型別,例如:1、2、3、…屬於 數字 的型別。那為什麼不直接使用程式原本就有的型別就好,還要額外的自己創立型別,如果每個資料都有自己的型別,不就會天下大亂嗎?
確實是這樣的。
當型別過多的時候,的確會變得很難管理,因此通常會有一個資料夾或是檔案專門來儲存型別,當需要型別時,就會先去找有沒有適合的。
因此設計型別這件事,在程式設計是一件嚴肅的事情,工程師需要清楚認識自己的資料,針對資料來設計型別。
那麼設計型別的好處在哪?接續豬豬的例子,在真實世界的豬豬不會只有一隻,一定是很多隻豬。
如果沒有豬豬型別,當我們有了新的小豬仔,在登記牠的資訊的時候,就有可能遺漏,而且當新小豬仔很多時,每個小豬仔的顏色就會變得混亂,能想像你的程式裡充滿了 pigA_color、pigB_color、…的變數嗎?除此之外,物件的屬性是可以預先填寫的,例如:眼睛=2,大部分正常豬豬的眼睛都是兩個,那麼只要建立物件,就可以省掉不斷賦值的行為。
回顧上一章
在上一章的 float 型別,我們提到了hex(),hex()出現在 int 以及 float 型別,但是用法有所不同。
了解物件後,你會發現 int 使用的 hex(),其實是屬於函式,而 float 的 hex(),則是 float 作為物件時,所擁有的方法。
結語
接下來就進入 資料型別 – string 的部分,開始來看 python 的多資料型別,順序為 string、dictionay and set、list and turple,不過 python 還有其他的資料型別,例如:bytes。但由於比較少用就不多做筆記了。
This article was written by 好想射射>///<. Any similarities to other works are purely coincidental.