物件導向初步

進階

類別是圖則、物件是實物。__init__ 設定初始屬性,self 代表物件自己;屬性存資料(s1.name),方法做行為(s1.introduce())。類別把資料和行為綁在一起,代碼有條理易重用。

適合:中三資訊及通訊科技 · 單元:程式設計進階 · 建議學習路徑第 3/13 課

學完呢課,你會識:
  • 類別是圖則,物件是按圖則建成的實例;一個類別可建無限多個物件。
  • 屬性存資料(s1.name),方法做行為(s1.introduce())。
  • __init__ 建構子在建立物件時自動執行,設定初始屬性。
文體:編程教學課有聲朗讀

文體小知識:編程教學課每個概念都配一段可以親手試的代碼例子,照住輸入、改一改,最快學會。

資訊及通訊科技Information & Communication Technology

§課文原文 Passage

1物件導向編程(OOP,Object-Oriented Programming)把資料和行為包在一起管理。類別(Class)是圖則:它定義「學生」有哪些資料和能做什麼;物件(Object)是按圖則建成的實物:小明、Mary 各是一個 Student 物件。一個類別可以建立無限多個物件。

2每個物件有屬性(Attribute)— 它的資料,例如姓名、班別;也有方法(Method)— 它會做的事,例如自我介紹、計平均分。建立物件時 Python 會自動執行 __init__(建構子),把初始屬性設定好;方法裡的 self 代表「這個物件自己」,讓每個物件存取自己的資料。

3定義一個學生類別:class Student: 之下 def __init__(self, name, cls): self.name = name, self.cls = cls。建立物件:s1 = Student("小明", "3A"),之後 s1.name 得 "小明"。加方法:def introduce(self): print("我是" + self.name + ",讀" + self.cls),呼叫 s1.introduce() 就印出「我是小明,讀3A」。

4為什麼要用 OOP?一個班幾十個學生,每個都有姓名、成績、行為 — 用清單和散亂變數很快就混亂;用類別把「學生的資料」和「學生能做的事」綁在一起,代碼有條理、容易重用。遊戲角色、手機 App、學校系統背後幾乎都是這樣組織的。

1重點摘要 Summary

類別是圖則、物件是實物。__init__ 設定初始屬性,self 代表物件自己;屬性存資料(s1.name),方法做行為(s1.introduce())。類別把資料和行為綁在一起,代碼有條理易重用。

2生字卡 Vocabulary

C
Class類別

定義一類物件的資料與行為的圖則,例如 Student 類別。

O
Object物件

按類別建立的實例,擁有自己的屬性,例如小明的 Student 物件。

A
Attribute屬性

物件內儲存的資料,例如 s1.name、s1.cls。

M
Method方法

物件可以執行的函數,定義在類別內,例如 introduce()。

_
__init__ (constructor)建構子

建立物件時自動執行的特殊方法,用來設定初始屬性。

s
self自身引用

方法中的第一個參數,代表呼叫該方法的物件本身,藉此存取自己的屬性。

I
Instance實例

物件的同義詞:由類別實際產生出來的一份個體。

I
Instantiate實例化

由類別建立物件的動作,例如 s1 = Student("小明", "3A")。

E
Encapsulation封裝

把資料和操作資料的方法包在同一類別內,外界不必理會內部細節。

3逐步講解 Steps

  1. 類別與物件的概念物件導向編程(OOP)把資料與行為包裝在一起管理。類別(Class)是圖則,定義「學生」這類事物有哪些資料、能做什麼;物件(Object)是按圖則建成的實物,小明與 Mary 各是一個 Student 物件。一個類別可以建立無數個物件,如同一份圖則可以興建無數個單位。現實對照:手機 App 中的每則訊息、每個聯絡人、每件商品,背後都是某個類別的物件。
  2. 用 __init__ 設定屬性屬性(Attribute)是物件攜帶的資料。在類別內定義 __init__ 方法(建構子),建立物件時 Python 會自動執行它:def __init__(self, name, cls): self.name = name 與 self.cls = cls 兩行,把傳入的 "小明" 與 "3A" 存進該物件。self 代表「這個物件自己」,令每個物件各自保管自己的資料。參數名稱可以任意,但 self 必須排在第一位,這是 Python 的固定規則。
  3. 建立物件與讀取屬性以 Student("小明", "3A") 建立物件並存入變數 s1。之後用點號存取屬性:s1.name 得 "小明",s1.cls 得 "3A"。屬性可以隨時修改:s1.cls = "3C" 之後再讀 s1.cls 便得 "3C"。多個物件互不干擾:s2 = Student("Mary", "3B") 之後,修改 s1 的屬性完全不影響 s2,因為每個物件有自己獨立的屬性副本,如同兩個學生各自持有自己的學生證。
  4. 方法:物件能做的事方法(Method)是類別內定義的函式,代表物件能做的事。def introduce(self): print("我是" + self.name + ",讀" + self.cls) 定義之後,呼叫 s1.introduce() 印出「我是小明,讀3A」。文法要點:定義時參數必須有 self,呼叫時則完全不傳,Python 會自動把 s1 填入 self。方法內可以讀取 self 的任何屬性,因此每次呼叫都用的是最新資料,不會過時。
  5. 方法用屬性做計算方法不只顯示資料,還能做計算。在類別內加入 def average(self): return sum(self.marks) / len(self.marks),並令 s1.marks = [80, 90, 70],呼叫 s1.average() 得 80.0。資料與計算綁在同一物件內:成績屬性更新之後,average 自動反映新數據,不必另行維護。這正是 OOP 的核心優勢——「誰的資料,誰的行為」,學生物件管好自己的成績與計算,程式結構便清晰分明。
  6. 為什麼要用物件導向設想處理全班幾十個學生:每人有姓名、班別、成績清單,還要計平均分、列自我介紹。用散亂的清單與變數,很快便會出現 names[3] 與 marks[3] 對不上位的混亂;用類別把「學生的資料」與「學生能做的事」綁在一起,每個學生一個物件,程式立即有條理。改動 average 方法一行,所有學生物件同步更新。遊戲角色、學校系統、購物平台,幾乎都以 OOP 組織程式。
  7. 完整例子與常見錯誤完整定義:class Student: 之下先寫 __init__ 存姓名與成績,再寫 average 方法。建立 s = Student("Mary", [80, 90, 70]),呼叫 print(s.average()) 得 80.0。常見錯誤有三:定義方法時忘記 self,程式報錯;呼叫時畫蛇添足寫成 s1.introduce(s1),Python 會把 s1 當成第二個參數;__init__ 拼寫錯誤(前後各兩條底線),屬性便不會自動設定。逐項避開,類別便可順利運作。

4圖解 Diagrams

物件導向初步:物件 = 屬性 + 方法 OOP物件 Object:一部手機屬性 attributes(佢係乜):顏色=黑・容量=256GB方法 methods(識做乜):影相()・打電話()類別 Class:設計圖一部「手機設計圖」可以量產無限部手機物件——每一部都有同一套屬性同方法,但數值可以唔同點解要 OOP:真實世界本來就係物件組成——程式照住現實建模,易諗易維護術語:類別 class=模;物件 object=照模整出來嘅成品
圖 1:物件=屬性+方法

5例題示範 Example

例題:定義 Student 類別(姓名與成績清單屬性),加入 average() 方法,並為成績 [80, 90, 70] 的 Mary 計算平均分。

  1. 定義類別與建構子:class Student: 之內 def __init__(self, name, marks): self.name = name,下一行 self.marks = marks。
  2. 加入計算方法:def average(self): return sum(self.marks) / len(self.marks),直接使用物件自己的 marks 屬性。
  3. 建立物件:s = Student("Mary", [80, 90, 70]),建構子自動把兩項資料存好。
  4. 呼叫方法:print(s.average());sum([80, 90, 70]) = 240,240 ÷ 3 = 80.0。
  5. 延伸:再建第二個物件 Student("Peter", [60, 65]),呼叫其 average() 得 62.5,兩個物件互不干擾。
  6. 答案:s.average() 回傳 80.0,即 Mary 三科的平均分。類別把資料(marks)與計算(average)綁在一起,每個物件各自保管成績,方法自動使用該物件的最新數據。

6常見錯誤 Mistakes

✗ 「def introduce(): 不用寫 self。」
✓ 類別內每個方法第一個參數必須是 self;漏了會出 TypeError,因為呼叫時 Python 會自動把物件傳入。
✗ 「s1.introduce 已經執行了方法。」
✓ 呼叫方法要加括號:s1.introduce();不加括號只是提及方法本身,什麼都不會發生。
✗ 「改 s1.name 之後 s2.name 也會接著變。」
✓ 每個物件有自己的屬性副本;s1 和 s2 互不相干,改一個不影響另一個。
✗ 「建構子寫成 def init(self) 也可以。」
✓ 必須是前後各兩條底線的 __init__,寫成 init 或 _init_ 都不會在建立物件時自動執行。
✗ 「Student 類別名寫 student 開頭小寫也可以。」
✓ 語法上可以,但 Python 慣例類別名大寫開頭(Student),方便一眼分辨類別與變數。

75 題快測 Quick check

Q1類別和物件的關係,哪個說法正確?A. 類別是圖則,物件是按圖則建成的實例 B. 物件是圖則,類別是實例 C. 兩者完全相同

Q2建立物件時,哪個方法會自動執行?

Q3s1 = Student("小明", "3A") 之後,s1.name 的值是什麼?

Q4方法定義 def introduce(self): 中,self 的作用是什麼?

Q5s1.marks = [70, 80],方法 average() 回傳 sum(self.marks) / len(self.marks)。s1.average() 是多少?

8重點回顧 Recap

  • 類別是圖則,物件是按圖則建成的實例;一個類別可建無限多個物件。
  • 屬性存資料(s1.name),方法做行為(s1.introduce())。
  • __init__ 建構子在建立物件時自動執行,設定初始屬性。
  • self 代表物件自己;方法定義要有 self,呼叫時不用傳。
  • 每個物件的屬性各自獨立;OOP 把資料和行為綁在一起,代碼有條理易重用。

同級其他科

同一科其他級別