不間斷 Python 挑戰 Day 19 - 物件導向程式設計:類別

更新於 發佈於 閱讀時間約 10 分鐘

到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。

Python其實是一種物件導向的程式(object oriented programming, 簡稱OOP)語言,Python的所有資料型別皆為物件,也允許開發者創造自己的物件。由於這種物件的概念易於擴充、維護與重複使用,被現代多數的程式語言所採用,也適合用來開發大型的專案。

從程序性的程式設計談起

假設我們要建立一個學生的分數登錄系統,在這個系統裡,我們需要記錄學生的姓名、各個科目的成績,也要能夠修改、查詢成績,以及增加新的科目。依照之前所學習的,可以用一個字串變數來記錄學生的姓名,用一個字典來記錄該學生每一科的分數。

student1_name = "Jack"
student1_score = {"Math": 0, "Physics": 0, "Chemistry": 0}

要修改其中一科的分數,先確認該科目是否存在於字典的鍵中,再修改對應的值。

if "Math" in student1_score:
  student1_score["Math"] = 80

同理,也可以取得其中一科的分數。

if "Math" in student1_score:
  print(student1_score["Math"])

若要新增一個新的科目,可直接增加一組鍵值對。

if "Art" not in student1_score:
  student1_score["Art"] = 0

接著我們要再登錄第二位學生的分數,以上的流程就要再重複一遍,似乎也還好,但如果有100位,甚至1000位學生的成績要登錄,這個過程就很可能變得很冗長且不易維護。

student2_name = "Rose"
student2_score = {"Math": 0, "Physics": 0, "Chemistry": 0}
...
...

物件導向程式設計-類別(Class)

就以上的觀察,我們可以這樣歸類:每位學生都是一個獨立的個體,屬於「學生」這個類別,每位學生都有不同的名字、分數,這些屬於每位學生個別的屬性(attribute),我們可以登錄或查詢每位學生各個科目的分數,或是新增新的科目,這些動作就屬於每位學生可以操作的方法(method);就如同在Python中,字典的資料型態是一個類別,我們所創造的每一個字典型態的資料都是字典這個類別的實體(instance),也稱為物件(object),而在字典一節所提過的keys()、values()、items()等就屬於字典的方法。

定義類別

類別的名稱,根據PEP 8的建議,要將所有單字合併,並且開頭的字母要大寫。定義類別的基本語法如下:

class MyClass:
  ......

以前例來說,我們可以定義一個Student類別,這裡的pass語法表示該區塊內容可以先跳過不執行。

class Student:
  pass

類別的初始化(Initialization)

類別的初始化是當一個宣告為這個類別的物件被建立時所會自動執行的方法,也稱為建構方法(constructor),它有一個固定的名稱為「__init__(self)」,其中的self是必須的,它代表了這個類別創造的物件本身,在初始化時會自動傳入。

下例中建立了一個空的建構方法,並創造一個屬於這個類別的student_1的物件。

class Student:

  # initialiation
  def __init__(self):
    pass

# create an object
student_1 = Student()

類別的建立可以沒有「__init__(self)」這個初始化函數,代表沒有參數需要被初始化,也可以傳入額外的參數,我們在後面會看到。

類別的屬性

類別的屬性區分為類別屬性(class attribute)與實體屬性(instance attribute)。類別屬性定義於建構方法之外,如下例中的classname,它不需要創造該類別的物件即可調用,一旦它被修改,所有的物件都會受到影響。

class Student:

  # class attribute
  classname = "My Class"

  # initialiation
  def __init__(self):
    pass

# access class attribute
print(Student.classname)

# create an object
student_1 = Student()

# modify class attribute
Student.classname = "Jack's Class"
print(Student.classname)
print(student_1.classname)

執行後可看到在student_1物件被創造出來前,即可透過Student.classname取得Student類別的classname屬性,並且當它被修改後,student_1物件取得的classname屬性也跟著改變。

My Class
Jack's Class
Jack's Class

實體屬性建立於建構方法內,或是在創造物件後透過「物件.屬性」生成,若建構方法內的實體屬性需要在物件建立時被初始化,可以在初始化函數__init__(self)後帶上該參數,並在函數內指派給該實體屬性。實體屬性在物件建立之後才可被調用,每個物件的實體屬性互相獨立,修改任一個物件的實體屬性不會影響到其它物件。

如以下範例,當創建Student類別的物件時傳入學生姓名到__init__(self, name)的name中,並指派給self.name,每個物件都有獨立的self.name屬性;此外,也建立了存放學生科目與成績的字典self.score。

class Student:

  # class attribute
  classname = "My Class"

  # initialiation
  def __init__(self, name):
    # instance attribute
    self.name = name
    self.score = {"Math": 0, "Physics": 0, "Chemistry": 0}

# create an object
student_1 = Student("Jack")
student_2 = Student("Rose")

print(student_1.name)
print(student_2.name)

執行結果:

Jack
Rose

類別的方法

類別方法的建立方式和前面提到的函數類似,差異在於類別方法和建構方法同樣必須傳入self參數,代表這個類別創造的物件本身,並且類別方法只有該類別所創造的物件才可調用。

以下範例中延續前面的架構,並新增了三個類別方法,分別操作登錄成績、查詢成績與新增科目。

class Student:

  # class attribute
  classname = "My Class"

  # initialization
  def __init__(self, name):
    # instance attribute
    self.name = name
    self.score = {"Math": 0, "Physics": 0, "Chemistry": 0}

  # methods
  def set_score(self, subject, score):
    if subject in self.score:
      self.score[subject] = score

  def get_score(self, subject):
    if subject in self.score:
    print(self.score[subject])

  def add_subject(self, subject):
    if subject not in self.score:
      self.score[subject] = 0

回到最一開始的例子,當我們需要完成一個學生的建檔、登錄成績、查詢成績與新增科目,只需要以下四行程式碼:

student_1 = Student("Jack")
student_1.set_score("Math", 80)
student_1.get_score("Math")
student_1.add_subject("Art")

增加新的學生時,Student類別可以重複被使用,不需再增加額外的資料結構與方法。

student_2 = Student("Rose")
student_2.set_score("Physics", 90)
student_2.get_score("Physics")
student_2.add_subject("Music")

程式範例

本文程式範例收錄於:
https://github.com/wjweng/marathon_python/blob/master/Day1_to_25/marathon_python_day19.py

留言
avatar-img
留言分享你的想法!
avatar-img
Wei-Jie Weng的沙龍
48會員
36內容數
Wei-Jie Weng的沙龍的其他內容
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
在上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
Thumbnail
2022/07/13
在上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
這篇文章介紹物件導向程式設計(OOP)的基本概念,包括類和物件的定義以及四大核心概念:封裝、繼承、多型和抽象。讀者將瞭解如何在Python中定義類和物件,並學習如何使用這些OOP特性來構建更具組織性和可維護性的程式碼。透過實例,文章探討如何將真實世界的物件模擬到程式設計中。
Thumbnail
這篇文章介紹物件導向程式設計(OOP)的基本概念,包括類和物件的定義以及四大核心概念:封裝、繼承、多型和抽象。讀者將瞭解如何在Python中定義類和物件,並學習如何使用這些OOP特性來構建更具組織性和可維護性的程式碼。透過實例,文章探討如何將真實世界的物件模擬到程式設計中。
Thumbnail
Class 類別 想像一下,假如我們要做一個有關食譜和食物的程式。首先,什麼是食譜呢?食譜是一個告訴我們如何做一道菜的指南,裡面會寫著需要的材料和做法。這就像是一個「類別」,它定義了一種事物的特性和行為。
Thumbnail
Class 類別 想像一下,假如我們要做一個有關食譜和食物的程式。首先,什麼是食譜呢?食譜是一個告訴我們如何做一道菜的指南,裡面會寫著需要的材料和做法。這就像是一個「類別」,它定義了一種事物的特性和行為。
Thumbnail
在第十五課中,我們將探索 Python 的基礎物件導向程式設計 (OOP) 概念。 物件導向程式設計是一種設計和組織程式碼的方法,它強調使用物件來表示資料和功能。
Thumbnail
在第十五課中,我們將探索 Python 的基礎物件導向程式設計 (OOP) 概念。 物件導向程式設計是一種設計和組織程式碼的方法,它強調使用物件來表示資料和功能。
Thumbnail
在第十一課中,我們將討論 Python 中的類別 (Classes) 和物件導向程式設計 (Object-Oriented Programming, OOP) 的概念。 物件導向程式設計是一種實現真實世界物件在程式中的模擬方式,這有助於更好地組織和管理程式碼。
Thumbnail
在第十一課中,我們將討論 Python 中的類別 (Classes) 和物件導向程式設計 (Object-Oriented Programming, OOP) 的概念。 物件導向程式設計是一種實現真實世界物件在程式中的模擬方式,這有助於更好地組織和管理程式碼。
Thumbnail
之前的课程里面,我们简单的接触了面向对象编程,也和大家讲解了其思想,优缺点。相信上节课程结束之后,大家对面向对象都有了一定的理解。 那么我们这节课,就进入面向对象的一些高阶部分,让我们继续来学习一些魔术方法以及Python的内置成员,然后再来学习一下描述符与设计模式。
Thumbnail
之前的课程里面,我们简单的接触了面向对象编程,也和大家讲解了其思想,优缺点。相信上节课程结束之后,大家对面向对象都有了一定的理解。 那么我们这节课,就进入面向对象的一些高阶部分,让我们继续来学习一些魔术方法以及Python的内置成员,然后再来学习一下描述符与设计模式。
Thumbnail
  物件導向(Object Oriented Programming,又稱OOP),在程式領域中很常會看到一些英文代稱,如果不懂的話就比較會不知道在說些什麼,所以除了知道中文名稱外也要稍微知道一下它的代稱是什麼會比較好唷! 一、什麼是物件導向?   把程式寫出來的功能集合成一個類別(class),接
Thumbnail
  物件導向(Object Oriented Programming,又稱OOP),在程式領域中很常會看到一些英文代稱,如果不懂的話就比較會不知道在說些什麼,所以除了知道中文名稱外也要稍微知道一下它的代稱是什麼會比較好唷! 一、什麼是物件導向?   把程式寫出來的功能集合成一個類別(class),接
Thumbnail
天啊!怎麼這麼混亂!網路上有一卡車的文章在談class、object、instance有什麼不同;在Stack Overflow中,關於object和instance間的差異,也一再有人問起。只是啊只是,看了一大堆的討論、解釋,似乎是懂了,但又總覺得不踏實,就好像漂蕩在太空中,明明目標就在眼前,但無
Thumbnail
天啊!怎麼這麼混亂!網路上有一卡車的文章在談class、object、instance有什麼不同;在Stack Overflow中,關於object和instance間的差異,也一再有人問起。只是啊只是,看了一大堆的討論、解釋,似乎是懂了,但又總覺得不踏實,就好像漂蕩在太空中,明明目標就在眼前,但無
Thumbnail
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
Thumbnail
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
Thumbnail
到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Thumbnail
到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Thumbnail
物件導向的概念,以python程式為範例。
Thumbnail
物件導向的概念,以python程式為範例。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News