[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 程式設計技能更上層樓,使你能夠處理更為複雜的專案需求。

歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言0
查看全部
發表第一個留言支持創作者!
Python 是一個功能強大的程式語言,提供了非常直觀的檔案處理方式。無論是處理數據檔案、讀取日誌文件,還是生成報表,檔案讀寫操作都是程式開發中的重要環節。這篇文章將帶你深入了解如何使用 Python 操作檔案,包括讀取和寫入、檔案模式選擇以及上下文管理器的使用。
在這篇教學中,我們將深入介紹 Python 的控制流程,包括 if-else 判斷、for 和 while 迴圈、break 和 continue 語句的使用,以及如何定義函數並進行參數傳遞。這些概念都是撰寫 Python 程式時的基礎知識,掌握它們將幫助你編寫更清晰、有效的程式碼。
Python 是一門功能強大且簡潔的程式語言,內建了多種資料結構來幫助開發者處理各種不同的需求。今天,我們將介紹五種常見的資料結構:字串、清單、元組、集合和字典,並學習它們的使用方式。
Python 是一個功能強大且易於學習的程式語言,適合初學者快速上手。今天,我們將介紹 Python 的幾個基礎概念,涵蓋變數、資料型別、運算符、條件判斷、迴圈和函式,這些是所有 Python 程式的核心組件。
Python 是一種功能強大且易於學習的程式語言,無論是初學者還是經驗豐富的開發者都可以從中獲益。在 Windows 作業系統上運行 Python,有許多不同的環境可以選擇,從基於網頁的開發環境到功能強大的集成開發環境 (IDE)。
Python 是目前最受歡迎的程式語言之一,它被廣泛應用於多個領域,如資料分析、網頁開發、機器學習和自動化。這篇文章將詳細介紹 Python 的基礎語法,並探討 Python 的優缺點、與其他程式語言的比較,最終解答為什麼你應該學習 Python。
Python 是一個功能強大的程式語言,提供了非常直觀的檔案處理方式。無論是處理數據檔案、讀取日誌文件,還是生成報表,檔案讀寫操作都是程式開發中的重要環節。這篇文章將帶你深入了解如何使用 Python 操作檔案,包括讀取和寫入、檔案模式選擇以及上下文管理器的使用。
在這篇教學中,我們將深入介紹 Python 的控制流程,包括 if-else 判斷、for 和 while 迴圈、break 和 continue 語句的使用,以及如何定義函數並進行參數傳遞。這些概念都是撰寫 Python 程式時的基礎知識,掌握它們將幫助你編寫更清晰、有效的程式碼。
Python 是一門功能強大且簡潔的程式語言,內建了多種資料結構來幫助開發者處理各種不同的需求。今天,我們將介紹五種常見的資料結構:字串、清單、元組、集合和字典,並學習它們的使用方式。
Python 是一個功能強大且易於學習的程式語言,適合初學者快速上手。今天,我們將介紹 Python 的幾個基礎概念,涵蓋變數、資料型別、運算符、條件判斷、迴圈和函式,這些是所有 Python 程式的核心組件。
Python 是一種功能強大且易於學習的程式語言,無論是初學者還是經驗豐富的開發者都可以從中獲益。在 Windows 作業系統上運行 Python,有許多不同的環境可以選擇,從基於網頁的開發環境到功能強大的集成開發環境 (IDE)。
Python 是目前最受歡迎的程式語言之一,它被廣泛應用於多個領域,如資料分析、網頁開發、機器學習和自動化。這篇文章將詳細介紹 Python 的基礎語法,並探討 Python 的優缺點、與其他程式語言的比較,最終解答為什麼你應該學習 Python。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
一切從"物件(Object)"開始 1.建立新物件 2.編輯物件內容 3.在物件中新增區塊
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
本文讓我們來淺談一下類別是什麼? 若想看詳細一點的python官方教學可點此連結 Python 的類別(Class)是一種面向物件導向程式設計的概念,讓你能夠創建具有屬性和方法的物件。類別是對現實世界中事物的抽象,它包含數據和操作這些數據的方法。它非常的抽象,想像一個類別就像是一個蛋糕模具,
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
一切從"物件(Object)"開始 1.建立新物件 2.編輯物件內容 3.在物件中新增區塊
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
本文讓我們來淺談一下類別是什麼? 若想看詳細一點的python官方教學可點此連結 Python 的類別(Class)是一種面向物件導向程式設計的概念,讓你能夠創建具有屬性和方法的物件。類別是對現實世界中事物的抽象,它包含數據和操作這些數據的方法。它非常的抽象,想像一個類別就像是一個蛋糕模具,
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。