[Python教學] 中級:物件導向程式設計(OOP)

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

Python 的物件導向程式設計 (Object-Oriented Programming, OOP) 是其最強大和靈活的特性之一。通過 OOP 的思想,我們可以組織、抽象並簡化程式碼結構,以達到更好的可維護性和可擴展性。本篇教學文章將深入介紹 Python 中的類別與物件、繼承、多型、封裝等面向對象的核心概念,並詳細解說方法與屬性的使用。

1. 類別與物件

在 Python 中,類別 是一種模版,用於定義某種對象應該具有的屬性和方法;物件 是類別的實例化結果,每個物件都可以有自己的屬性數據。

1.1 類別定義與物件實例化

我們可以使用 class 關鍵字來定義一個類別,並在類別內部定義屬性與方法。

# 定義類別
class Dog:
# 初始化方法,用於設置物件屬性
def __init__(self, name, age):
self.name = name # 屬性
self.age = age # 屬性

# 方法:定義物件行為
def bark(self):
print(f"{self.name} says: Woof!")

# 創建物件(實例化類別)
my_dog = Dog("Buddy", 3)
print(f"My dog's name is {my_dog.name} and he's {my_dog.age} years old.")
my_dog.bark()

在這段程式碼中:

  • Dog 是一個類別,定義了狗的 nameage 屬性,並且有一個 bark() 方法。
  • __init__ 方法稱為 初始化方法,每當創建物件時自動調用,以設置物件的初始屬性值。
  • my_dogDog 類別的物件,它的 name 是 "Buddy",age 是 3,並可以調用 bark() 方法。

2. 屬性與方法

2.1 屬性

屬性可以理解為物件的特徵或狀態,例如「年齡」或「名字」。在 Python 中,屬性通常在初始化方法 __init__ 中使用 self 進行定義:

class Car:
def __init__(self, model, year):
self.model = model
self.year = year

2.2 方法

方法是定義在類別中的函式,用於描述物件的行為。方法的第一個參數通常為 self,表示對當前物件的引用。

class Car:
def __init__(self, model, year):
self.model = model
self.year = year

def start(self):
print(f"{self.model} is starting.")

# 使用方法
my_car = Car("Toyota", 2020)
my_car.start()

3. 繼承 (Inheritance)

繼承 是一種將現有類別的屬性和方法傳承至新類別的方式。通過繼承,子類別可以獲得父類別的屬性和方法,同時也能新增自己的屬性和方法。

class Animal:
def __init__(self, name):
self.name = name

def speak(self):
print("Some sound")

class Dog(Animal): # Dog 繼承 Animal 類別
def speak(self): # 覆寫父類別方法
print(f"{self.name} says: Woof!")

class Cat(Animal): # Cat 繼承 Animal 類別
def speak(self): # 覆寫父類別方法
print(f"{self.name} says: Meow!")

dog = Dog("Buddy")
cat = Cat("Whiskers")

dog.speak() # Buddy says: Woof!
cat.speak() # Whiskers says: Meow!

這裡,DogCat 都繼承了 Animal 的屬性和方法,但覆寫了 speak() 方法,以提供各自的特定行為。

4. 多型 (Polymorphism)

多型 允許不同類別的物件在呼叫相同方法時表現出不同的行為。在 Python 中,多型的概念通常與繼承和方法覆寫結合使用。

在上例中,DogCat 都擁有 speak() 方法。無論哪一種物件,當我們呼叫 speak() 時,它們會各自表現出不同的行為,這就是多型。

# 定義一個接受多型的函式
def animal_sound(animal):
animal.speak()

animal_sound(dog) # Buddy says: Woof!
animal_sound(cat) # Whiskers says: Meow!

這樣,我們可以通過 animal_sound 函數對不同類別的物件進行相同的操作,這就是多型的應用。

5. 封裝 (Encapsulation)

封裝 是將類別的屬性和方法保護起來,使得它們無法在類別外部被直接訪問和修改。這樣可以限制外部程式對類別內部的干涉,確保數據的安全性。Python 透過以下方式來實現封裝:

  • 單下劃線 _attribute:屬性或方法被視為「保護」。
  • 雙下劃線 __attribute:屬性或方法被視為「私有」。
class Account:
def __init__(self, owner, balance):
self.owner = owner
self.__balance = balance # 私有屬性

def deposit(self, amount):
self.__balance += amount

def get_balance(self):
return self.__balance

account = Account("John", 100)
account.deposit(50)
print(account.get_balance()) # 150

在此例中,__balance 是一個私有屬性,外部無法直接存取,只能透過 get_balance 取得。

6. 綜合範例:完整的類別設計

綜合以上概念,以下是一個使用類別、屬性、方法、繼承、多型及封裝的完整範例:

class Employee:
def __init__(self, name, salary):
self.name = name
self.__salary = salary # 私有屬性

def get_salary(self):
return self.__salary

def work(self):
print(f"{self.name} is working.")

class Manager(Employee): # 繼承 Employee
def work(self): # 覆寫方法
print(f"{self.name} is managing.")

class Developer(Employee): # 繼承 Employee
def work(self): # 覆寫方法
print(f"{self.name} is developing.")

def employee_task(employee):
employee.work()

manager = Manager("Alice", 5000)
developer = Developer("Bob", 4000)

# 執行工作
employee_task(manager) # Alice is managing.
employee_task(developer) # Bob is developing.

# 獲取薪水
print(manager.get_salary()) # 5000
print(developer.get_salary()) # 4000

此範例展示了:

  • 類別與物件EmployeeManagerDeveloper 類別。
  • 屬性與方法name 屬性和 work() 方法。
  • 繼承ManagerDeveloper 繼承自 Employee
  • 多型employee_task() 函數接收不同類別的物件並執行其 work() 方法。
  • 封裝__salary 屬性為私有屬性,外部無法直接存取。

小結

Python 的物件導向程式設計可以讓我們在處理複雜專案時,更加組織化和模組化。透過類別與物件、繼承、多型和封裝,我們能夠創建靈活的程式碼結構,使程式易於擴展與維護。學習 OOP 會讓你的 Python 程式設計技能更上層樓,使你能夠處理更為複雜的專案需求。

留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
12會員
163內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/04/28
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
2025/04/28
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
2025/04/22
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
2025/04/22
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
2025/04/16
嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!
2025/04/16
嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!
看更多
你可能也想看
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
學習Python核心語法,從變數、資料型態到物件導向程式設計,涵蓋15個重要技巧,並包含實例與說明,助你快速建立程式基礎。
Thumbnail
學習Python核心語法,從變數、資料型態到物件導向程式設計,涵蓋15個重要技巧,並包含實例與說明,助你快速建立程式基礎。
Thumbnail
Python 是一種非常優秀的程式語言,但它是否是「最好」的語言,取決於具體的使用場景和需求。 以下是 Python 的優勢與限制: Python 的優勢 1. 簡潔易學 • 語法接近自然語言,適合初學者,能快速上手並實現想法。 • 程式碼可讀性高,減少了開發和維護成本。 2. 豐
Thumbnail
Python 是一種非常優秀的程式語言,但它是否是「最好」的語言,取決於具體的使用場景和需求。 以下是 Python 的優勢與限制: Python 的優勢 1. 簡潔易學 • 語法接近自然語言,適合初學者,能快速上手並實現想法。 • 程式碼可讀性高,減少了開發和維護成本。 2. 豐
Thumbnail
這個單元我一直很想學習,物件導向 Object Oriented Programming 以前一直以為是一種程式碼,其實是設計程式的觀念,文中我分享了程式碼還有自己想的比喻讓讀者更好理解。除了物件導向,我還介紹其他四種風格的程式碼設計,跟大家一起學習。
Thumbnail
這個單元我一直很想學習,物件導向 Object Oriented Programming 以前一直以為是一種程式碼,其實是設計程式的觀念,文中我分享了程式碼還有自己想的比喻讓讀者更好理解。除了物件導向,我還介紹其他四種風格的程式碼設計,跟大家一起學習。
Thumbnail
這篇文章介紹物件導向程式設計(OOP)的基本概念,包括類和物件的定義以及四大核心概念:封裝、繼承、多型和抽象。讀者將瞭解如何在Python中定義類和物件,並學習如何使用這些OOP特性來構建更具組織性和可維護性的程式碼。透過實例,文章探討如何將真實世界的物件模擬到程式設計中。
Thumbnail
這篇文章介紹物件導向程式設計(OOP)的基本概念,包括類和物件的定義以及四大核心概念:封裝、繼承、多型和抽象。讀者將瞭解如何在Python中定義類和物件,並學習如何使用這些OOP特性來構建更具組織性和可維護性的程式碼。透過實例,文章探討如何將真實世界的物件模擬到程式設計中。
Thumbnail
在第十五課中,我們將探索 Python 的基礎物件導向程式設計 (OOP) 概念。 物件導向程式設計是一種設計和組織程式碼的方法,它強調使用物件來表示資料和功能。
Thumbnail
在第十五課中,我們將探索 Python 的基礎物件導向程式設計 (OOP) 概念。 物件導向程式設計是一種設計和組織程式碼的方法,它強調使用物件來表示資料和功能。
Thumbnail
在第十一課中,我們將討論 Python 中的類別 (Classes) 和物件導向程式設計 (Object-Oriented Programming, OOP) 的概念。 物件導向程式設計是一種實現真實世界物件在程式中的模擬方式,這有助於更好地組織和管理程式碼。
Thumbnail
在第十一課中,我們將討論 Python 中的類別 (Classes) 和物件導向程式設計 (Object-Oriented Programming, OOP) 的概念。 物件導向程式設計是一種實現真實世界物件在程式中的模擬方式,這有助於更好地組織和管理程式碼。
Thumbnail
天啊!怎麼這麼混亂!網路上有一卡車的文章在談class、object、instance有什麼不同;在Stack Overflow中,關於object和instance間的差異,也一再有人問起。只是啊只是,看了一大堆的討論、解釋,似乎是懂了,但又總覺得不踏實,就好像漂蕩在太空中,明明目標就在眼前,但無
Thumbnail
天啊!怎麼這麼混亂!網路上有一卡車的文章在談class、object、instance有什麼不同;在Stack Overflow中,關於object和instance間的差異,也一再有人問起。只是啊只是,看了一大堆的討論、解釋,似乎是懂了,但又總覺得不踏實,就好像漂蕩在太空中,明明目標就在眼前,但無
Thumbnail
到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Thumbnail
到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Thumbnail
物件導向的概念,以python程式為範例。
Thumbnail
物件導向的概念,以python程式為範例。
Thumbnail
雖然不能說,每一個人都該學 Python。但對於那些沒學過程式語言、且不知道將來想走哪個資訊領域的初學者來說,Python 是這些人應該學的第一個語言,絕對當之無愧!
Thumbnail
雖然不能說,每一個人都該學 Python。但對於那些沒學過程式語言、且不知道將來想走哪個資訊領域的初學者來說,Python 是這些人應該學的第一個語言,絕對當之無愧!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News