文章

第15天:面向對象程式設計(OOP)入門

課程簡介

面向對象程式設計(OOP)是一種常用的編程範式,將程式分為物件與類別。物件是類別的具體實例,而類別則定義了物件的屬性和方法。OOP 強調程式的模組化、可重用性和維護性。今天我們將學習 OOP 的基本概念,包括類別、物件、屬性與方法,以及如何創建自己的類別和物件。


學習內容

1. 物件與類別

  • 類別(Class) 是對事物的抽象,定義了該類事物的屬性(變數)和行為(方法)。
  • 物件(Object) 是類別的實例,擁有類別定義的屬性和方法。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 定義一個類別
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)
print(my_dog.name)  # 輸出: Buddy
my_dog.bark()       # 輸出: Buddy is barking!

2. __init__() 方法

__init__() 方法是類別的建構函數(constructor),在創建物件時自動執行,用來初始化物件的屬性。self 參數代表物件本身,必須是方法的第一個參數。

範例:

1
2
3
4
5
6
7
class Car:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model

my_car = Car("Toyota", "Corolla")
print(my_car.brand)  # 輸出: Toyota

3. 屬性與方法

  • 屬性(Attributes) 是物件的變數,描述物件的特性。
  • 方法(Methods) 是物件的行為,描述物件可以執行的操作。方法是定義在類別中的函數。

範例:

1
2
3
4
5
6
7
8
9
10
11
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def introduce(self):
        print(f"My name is {self.name}, and I am {self.age} years old.")

# 創建物件並使用屬性和方法
person = Person("Alice", 30)
person.introduce()  # 輸出: My name is Alice, and I am 30 years old.

4. 類別變數與實例變數

  • 實例變數 是屬於物件的變數,不同物件之間的實例變數是相互獨立的。
  • 類別變數 是屬於整個類別的變數,所有物件共享同一個類別變數。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
class Employee:
    company = "ABC Corp"  # 類別變數

    def __init__(self, name, salary):
        self.name = name      # 實例變數
        self.salary = salary  # 實例變數

emp1 = Employee("John", 5000)
emp2 = Employee("Jane", 6000)

print(emp1.company)  # 輸出: ABC Corp
print(emp2.company)  # 輸出: ABC Corp

5. 繼承(Inheritance)

繼承允許一個類別從另一個類別繼承屬性和方法,這使得子類別能夠擴展或修改父類別的功能。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        print(f"{self.name} makes a sound.")

# Dog 繼承 Animal
class Dog(Animal):
    def speak(self):  # 重寫父類別的方法
        print(f"{self.name} barks.")

my_dog = Dog("Buddy")
my_dog.speak()  # 輸出: Buddy barks.

6. 多型(Polymorphism)

多型允許同一方法在不同類別中有不同的實現,這使得我們可以使用相同的介面來處理不同的物件。

範例:

1
2
3
4
5
6
7
8
9
10
class Cat(Animal):
    def speak(self):
        print(f"{self.name} meows.")

animals = [Dog("Buddy"), Cat("Whiskers")]

for animal in animals:
    animal.speak()
# Buddy barks.
# Whiskers meows.

7. 封裝(Encapsulation)

封裝是一種將屬性和方法保護起來的技術,使用 _來定義保護屬性 或 __ 開頭來定義私有屬性或方法,這些屬性和方法只能在類別內部訪問。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class BankAccount:
    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 = BankAccount("Alice", 1000)
account.deposit(500)
print(account.get_balance())  # 輸出: 1500

教學重點

  • 類別與物件:理解類別與物件的基本概念,學會創建類別和物件。
  • 屬性與方法:瞭解如何定義物件的屬性和方法,並透過 __init__() 初始化物件。
  • 繼承與多型:學會如何使用繼承和多型來擴展類別的功能和重用程式碼。
  • 封裝:了解如何使用封裝來保護物件的資料,並在類別內部進行管理。

任務

  1. 創建一個類別 Book,包含書名和作者的屬性,以及一個方法 display(),用來顯示書籍資訊。
  2. 創建一個類別 Employee,包含員工姓名和薪水的屬性,並添加一個 give_raise() 方法來增加薪水。
  3. 創建一個類別 Vehicle,定義速度和顏色的屬性,然後建立一個子類別 Car,新增座位數屬性並重寫 display_info() 方法來顯示車輛資訊。
  4. 創建一個 BankAccount 類別,並使用封裝來保護帳戶餘額,定義存款和取款方法。
本文章以 CC BY 4.0 授權