今天我們將進入 Python 的進階主題之一:物件導向程式設計(OOP)。這是現代程式設計中一個非常重要的概念。OOP 不僅能夠提升代碼的結構化與可維護性,還能讓我們更好地模擬現實世界中的物件與行為。
物件導向程式設計 是一種以物件(Objects)為核心的程式設計方法。物件是某一類型的實例,它們有自己的屬性(Attributes)和方法(Methods),可以看作是現實世界中的具體實體。這種設計方式幫助我們將程式劃分為許多不同的「物件」,每個物件都負責不同的功能。
在 OOP 中,有四個關鍵概念需要理解:
類別(Class):
物件(Object):
封裝(Encapsulation):
繼承(Inheritance):
class
關鍵字:
class Dog:
# 初始化方法(constructor)
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)
print(my_dog.name) # 輸出:Buddy
print(my_dog.age) # 輸出:5
my_dog.bark() # 輸出:Buddy is barking!
name
和 age
。bark()
方法讓狗「叫」。my_dog.age = 6 # 更新年齡
print(my_dog.age) # 輸出:6
封裝讓物件的內部狀態(屬性)不可直接從外部訪問,只能通過指定的方法來間接修改或讀取。
__
來定義私有屬性:
class Cat:
def __init__(self, name, age):
self.__name = name # 私有屬性
self.age = age
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
get_name()
和 set_name()
方法來訪問或更新 __name
屬性。
my_cat = Cat("Whiskers", 3)
print(my_cat.get_name()) # 輸出:Whiskers
my_cat.set_name("Felix")
print(my_cat.get_name()) # 輸出:Felix
繼承可以讓我們從一個現有的類別中創建新的類別,並且可以在此基礎上擴展功能。
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
print(f"{self.name} is making a sound.")
class Dog(Animal): # Dog 繼承自 Animal
def bark(self):
print(f"{self.name} is barking!")
Dog
繼承了 Animal
的屬性和方法,並且擴展了 bark()
方法:
my_dog = Dog("Buddy")
my_dog.make_sound() # 輸出:Buddy is making a sound.
my_dog.bark() # 輸出:Buddy is barking!
class Dog(Animal):
def make_sound(self):
print(f"{self.name} is barking!")
class Student:
def __init__(self, name, age, student_id):
self.name = name
self.age = age
self.student_id = student_id
def display_info(self):
print(f"學生:{self.name}, 年齡:{self.age}, 學號:{self.student_id}")
# 創建學生物件
student1 = Student("Alice", 20, "A001")
student1.display_info() # 輸出:學生:Alice, 年齡:20, 學號:A001
class Teacher(Student):
def __init__(self, name, age, student_id, title):
super().__init__(name, age, student_id)
self.title = title
def display_info(self):
print(f"老師:{self.name}, 年齡:{self.age}, 學號:{self.student_id}, 職稱:{self.title}")
teacher1 = Teacher("Bob", 35, "T001", "教授")
teacher1.display_info() # 輸出:老師:Bob, 年齡:35, 學號:T001, 職稱:教授
這個練習要求建立一個類別來表示書籍,並包含書名、作者和價格等屬性,然後創建兩個不同的書籍物件。
# 建立 Book 類別
class Book:
def __init__(self, title, author, price):
self.title = title
self.author = author
self.price = price
def display_info(self):
print(f"書名: {self.title}, 作者: {self.author}, 價格: {self.price}元")
# 創建兩個書籍物件
book1 = Book("Python 程式設計", "張三", 450)
book2 = Book("數據科學導論", "李四", 550)
# 顯示書籍資訊
book1.display_info()
book2.display_info()
__init__()
:類別的建構子,用來初始化每個物件的屬性,如書名、作者和價格。display_info()
:自訂方法,用於輸出書籍的基本資訊。book1
和 book2
是兩個不同的 Book
物件,展示了如何用這個類別來創建不同的書籍。這個練習要求建立一個基礎的車輛類別,並繼承它創建一個汽車類別,擴展汽車功能,例如增加速度屬性。
# 基礎的車輛類別
class Vehicle:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def display_info(self):
print(f"品牌: {self.brand}, 型號: {self.model}")
# 繼承 Vehicle 類別的汽車類別
class Car(Vehicle):
def __init__(self, brand, model, speed):
super().__init__(brand, model) # 呼叫父類別的建構子
self.speed = speed # 新增速度屬性
# 重寫 display_info 方法,擴展功能
def display_info(self):
super().display_info() # 使用父類別的 display_info 方法
print(f"速度: {self.speed} km/h")
# 創建一個汽車物件
car = Car("Toyota", "Corolla", 180)
# 顯示汽車資訊
car.display_info()
class Car(Vehicle)
):Car
類別繼承了 Vehicle
類別,擁有 Vehicle
的屬性和方法。super()
:用來呼叫父類別的 __init__()
和其他方法,確保父類別的功能被保留並擴展。display_info()
):在 Car
類別中重寫了 Vehicle
的 display_info()
方法,並添加了汽車的速度資訊。這兩個練習幫助你熟悉類別的基本概念、物件創建、繼承與方法重寫等面向對象程式設計的關鍵概念。
今天我們深入學習了物件導向程式設計的基礎,包括類別、物件、封裝和繼承等核心概念。OOP 提供了一個強大且靈活的工具來組織和管理程式碼,讓我們能夠構建更具結構性和可維護性的應用程式。
第十六天:使用 Python 進行網頁抓取(Web Scraping)