今天我們將進入 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)