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