今天我們將進入 Python 中的物件導向程式設計(Object-Oriented Programming, OOP)。這是一種程式設計範式,允許我們使用「物件」來封裝數據和操作,並通過類別來設計可重用的程式結構。物件導向程式設計在現代軟體開發中非常重要,透過它可以使程式更具結構性、可讀性及擴展性。
基本概念
OOP 的主要特性
如何定義一個類別
class
關鍵字來定義類別:
class Dog:
def __init__(self, name, age):
self.name = name # 定義屬性
self.age = age
def bark(self):
print(f"{self.name} is barking.") # 定義方法
創建物件
my_dog = Dog("Buddy", 5) # 創建一個 Dog 類別的物件
print(my_dog.name) # 訪問物件屬性
my_dog.bark() # 調用物件的方法
__init__
構造方法介紹
__init__
是類別的構造方法,用於在創建物件時初始化屬性:
class Car:
def __init__(self, brand, model, year):
self.brand = brand
self.model = model
self.year = year
def description(self):
return f"{self.year} {self.brand} {self.model}"
實例化與使用屬性
my_car = Car("Toyota", "Corolla", 2020)
print(my_car.description()) # 2020 Toyota Corolla
實例方法
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
類別屬性與實例屬性
class Employee:
company = "TechCorp" # 類別屬性
def __init__(self, name):
self.name = name # 實例屬性
改變屬性
employee = Employee("Alice")
employee.name = "Bob" # 修改實例屬性
繼承:重用現有類別
class Animal:
def __init__(self, name):
self.name = name
def sound(self):
pass
class Dog(Animal):
def sound(self):
return "Woof"
class Cat(Animal):
def sound(self):
return "Meow"
多型:實現相同方法的不同行為
animals = [Dog("Buddy"), Cat("Whiskers")]
for animal in animals:
print(f"{animal.name} says {animal.sound()}")
遊戲開發
數據模型
軟體設計模式
範例 1:動物類別繼承與多型
撰寫一個基礎類別 Animal
,並從中派生出不同的動物類別(如 Dog
、Cat
)。讓每個動物類別都有自己特有的聲音方法,並創建一些動物物件來呼叫這些方法。
class Animal:
def __init__(self, name):
self.name = name
def sound(self):
pass
class Dog(Animal):
def sound(self):
return "Woof"
class Cat(Animal):
def sound(self):
return "Meow"
# 創建物件
dog = Dog("Buddy")
cat = Cat("Whiskers")
# 調用方法
print(f"{dog.name} says {dog.sound()}")
print(f"{cat.name} says {cat.sound()}")
範例 2:簡易銀行系統
Account
,實現存款、取款、查詢餘額等功能:
class Account:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
def deposit(self, amount):
self.balance += amount
return f"{amount} deposited. New balance: {self.balance}"
def withdraw(self, amount):
if amount > self.balance:
return "Insufficient funds"
self.balance -= amount
return f"{amount} withdrawn. New balance: {self.balance}"
def get_balance(self):
return f"Account owner: {self.owner}, Balance: {self.balance}"
# 創建帳戶
acc = Account("Alice", 1000)
# 存款與取款操作
print(acc.deposit(500))
print(acc.withdraw(200))
print(acc.get_balance())
Student
,包含學生的姓名和成績。撰寫方法來輸出學生的基本資料和計算平均成績。speak()
方法,並根據不同的動物輸出不同的叫聲。目標:創建一個 Student
類別,並包含學生的姓名和成績。撰寫方法來輸出學生的基本資料和計算平均成績。
class Student:
def __init__(self, name, grades):
self.name = name
self.grades = grades # 成績列表
def display_info(self):
print(f"學生姓名: {self.name}")
print(f"成績: {self.grades}")
def calculate_average(self):
if len(self.grades) > 0:
return sum(self.grades) / len(self.grades)
else:
return 0
# 測試程式
student1 = Student("張三", [90, 85, 88, 92])
student1.display_info()
print(f"平均成績: {student1.calculate_average():.2f}")
__init__
:初始化方法,用來在創建物件時設定學生的姓名和成績。display_info
:輸出學生的基本資料。calculate_average
:計算並返回學生成績的平均值。目標:設計一個程式,讓不同的動物類別實現相同的 speak()
方法,並根據不同的動物輸出不同的叫聲。
class Animal:
def speak(self):
raise NotImplementedError("子類別必須實作這個方法")
class Dog(Animal):
def speak(self):
return "汪汪!"
class Cat(Animal):
def speak(self):
return "喵喵!"
class Cow(Animal):
def speak(self):
return "哞哞!"
# 測試程式
animals = [Dog(), Cat(), Cow()]
for animal in animals:
print(f"{animal.__class__.__name__} 叫聲: {animal.speak()}")
Animal
類別並實現了 speak()
方法,根據不同的動物實現各自的叫聲。__class__.__name__
:用來取得物件的類別名稱,便於顯示是什麼動物。目標:基於先前的銀行系統,為帳戶添加轉帳功能,使不同帳戶之間能夠進行轉帳。
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
def deposit(self, amount):
if amount > 0:
self.balance += amount
print(f"{self.owner} 存入 {amount} 元,餘額為 {self.balance} 元")
else:
print("存入金額無效。")
def withdraw(self, amount):
if 0 < amount <= self.balance:
self.balance -= amount
print(f"{self.owner} 提取 {amount} 元,餘額為 {self.balance} 元")
else:
print("餘額不足或無效的取款金額。")
def transfer(self, recipient, amount):
if self.balance >= amount > 0:
self.balance -= amount
recipient.balance += amount
print(f"{self.owner} 向 {recipient.owner} 轉帳 {amount} 元")
print(f"{self.owner} 餘額: {self.balance} 元")
print(f"{recipient.owner} 餘額: {recipient.balance} 元")
else:
print("轉帳失敗,餘額不足或無效金額。")
# 測試程式
account1 = BankAccount("張三", 1000)
account2 = BankAccount("李四", 500)
account1.transfer(account2, 300)
transfer
:這是新增的轉帳功能,允許將指定金額從一個帳戶轉移到另一個帳戶。該功能首先會檢查轉帳者是否有足夠的餘額,然後才進行轉帳。物件導向程式設計是軟體開發中的一個核心概念,透過類別和物件,我們可以將程式模組化、結構化,使其更具維護性和可擴展性。在學習物件導向時,理解類別、物件、屬性、方法以及 OOP 的四大特性(封裝、繼承、多型、抽象)非常重要。希望今天的課程能夠幫助大家打下堅實的基礎,讓未來的專案開發更加順利。
第十三天:進階 Python:錯誤處理與例外管理