iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

第十五天:Python 進階 - 物件導向程式設計 (OOP) 基礎

內容概述:

今天我們將進入 Python 的進階主題之一:物件導向程式設計(OOP)。這是現代程式設計中一個非常重要的概念。OOP 不僅能夠提升代碼的結構化與可維護性,還能讓我們更好地模擬現實世界中的物件與行為。


一、什麼是物件導向程式設計?

物件導向程式設計 是一種以物件(Objects)為核心的程式設計方法。物件是某一類型的實例,它們有自己的屬性(Attributes)和方法(Methods),可以看作是現實世界中的具體實體。這種設計方式幫助我們將程式劃分為許多不同的「物件」,每個物件都負責不同的功能。


二、OOP 中的四個核心概念

在 OOP 中,有四個關鍵概念需要理解:

  1. 類別(Class)

    • 類別是一個藍圖,用來定義某種物件的屬性與行為。可以把它看作是模板。
  2. 物件(Object)

    • 物件是類別的具體實例。你可以創建多個不同的物件,它們共享類別的結構,但每個物件都可以有自己獨立的數據。
  3. 封裝(Encapsulation)

    • 將物件的數據和方法保護起來,使外部無法直接訪問和修改,增加了程式的安全性。
  4. 繼承(Inheritance)

    • 一個類別可以從另一個類別繼承屬性和方法,減少代碼重複,提升程式的可維護性。

三、Python 中的類別與物件

1. 定義類別
  • 在 Python 中,類別的定義使用 class 關鍵字:
    class Dog:
        # 初始化方法(constructor)
        def __init__(self, name, age):
            self.name = name  # 定義屬性
            self.age = age
    
        # 方法
        def bark(self):
            print(f"{self.name} is barking!")
    
2. 創建物件
  • 創建物件需要呼叫類別並提供初始化的參數:
    my_dog = Dog("Buddy", 5)
    print(my_dog.name)  # 輸出:Buddy
    print(my_dog.age)   # 輸出:5
    my_dog.bark()       # 輸出:Buddy is barking!
    
3. 屬性和方法
  • 屬性 是物件的狀態,如上例中的 nameage
  • 方法 是物件的行為,像 bark() 方法讓狗「叫」。
4. 修改屬性
  • 可以直接修改屬性的值:
    my_dog.age = 6  # 更新年齡
    print(my_dog.age)  # 輸出:6
    

四、封裝的概念

封裝讓物件的內部狀態(屬性)不可直接從外部訪問,只能通過指定的方法來間接修改或讀取。

1. 將屬性設為私有
  • 使用雙下劃線 __ 來定義私有屬性:
    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
    

五、繼承的概念

繼承可以讓我們從一個現有的類別中創建新的類別,並且可以在此基礎上擴展功能。

1. 繼承的基本語法
  • 定義一個類別並從另一個類別繼承:
    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!")
    
2. 使用繼承的類別
  • Dog 繼承了 Animal 的屬性和方法,並且擴展了 bark() 方法:
    my_dog = Dog("Buddy")
    my_dog.make_sound()  # 輸出:Buddy is making a sound.
    my_dog.bark()        # 輸出:Buddy is barking!
    
3. 方法重寫(Overriding)
  • 在繼承中,可以重寫父類的方法,提供子類自己的實現:
    class Dog(Animal):
        def make_sound(self):
            print(f"{self.name} is barking!")
    

六、實作範例

範例 1:創建一個簡單的類別
  • 我們來創建一個表示學生的類別,這個類別包含學生的名字、年齡和學號:
    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
    
範例 2:繼承與擴展
  • 創建一個老師類別,繼承自學生類別,並增加職稱屬性:
    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, 職稱:教授
    

七、練習與實作

練習 1:建立自己的類別
  • 建立一個類別來表示一本書,包含書名、作者和價格,並創建兩個不同的書籍物件來練習。
練習 2:繼承與方法重寫
  • 建立一個類別表示車輛,再繼承它創建一個汽車類別,並擴展汽車的功能,比如增加速度屬性。

解答:

練習 1:建立自己的類別

這個練習要求建立一個類別來表示書籍,並包含書名、作者和價格等屬性,然後創建兩個不同的書籍物件。

# 建立 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():自訂方法,用於輸出書籍的基本資訊。
  • 兩個書籍物件book1book2 是兩個不同的 Book 物件,展示了如何用這個類別來創建不同的書籍。

練習 2:繼承與方法重寫

這個練習要求建立一個基礎的車輛類別,並繼承它創建一個汽車類別,擴展汽車功能,例如增加速度屬性。

# 基礎的車輛類別
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 類別中重寫了 Vehicledisplay_info() 方法,並添加了汽車的速度資訊。

這兩個練習幫助你熟悉類別的基本概念、物件創建、繼承與方法重寫等面向對象程式設計的關鍵概念。


八、學習總結

今天我們深入學習了物件導向程式設計的基礎,包括類別、物件、封裝和繼承等核心概念。OOP 提供了一個強大且靈活的工具來組織和管理程式碼,讓我們能夠構建更具結構性和可維護性的應用程式。


下一堂課預告

第十六天:使用 Python 進行網頁抓取(Web Scraping)


上一篇
從 0 開始學!跟著 ChatGPT 學會 Python 讀取&寫入文件
下一篇
跟著 ChatGPT成為程式大佬!Python 網頁抓取(Web Scraping)
系列文
如果讓chatgpt參加iThome鐵人賽,他竟然寫出...!?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言