iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0
生成式 AI

一塊一塊拼湊的 AI 樂高世界之旅系列 第 6

# Day 6:物件導向 Part 1 (類別、物件、屬性、方法、self、__init__)

  • 分享至 

  • xImage
  •  

前言

在學過變數、運算子、條件判斷、迴圈以及函式之後,我們已經能寫出有邏輯、能重複利用的程式。但隨著功能越來越多,光靠函式和變數來組織程式碼,仍然容易變得凌亂。

物件導向(OOP, Object-Oriented Programming) 就是為了解決這個問題而設計的一種程式設計方式。它的核心精神是:

  • 類別(Class):先寫好「規格」或「藍圖」。
  • 物件(Object):照藍圖生產出來的「實體」。
  • 屬性(Attribute):物件的資料(例如姓名、年齡、顏色)。
  • 方法(Method):物件能做的事情(例如說話、移動、運算)。

用生活來比喻:

  • 類別就像建築藍圖,
  • 物件就是依照藍圖蓋出來的房子,
  • 屬性是房子的坪數、顏色,
  • 方法則是「開門」、「打開電燈」等行為。

今天會帶你掌握 OOP 的第一步:

  1. 認識類別與物件的基本概念。
  2. 學會使用 __init__ 初始化物件。
  3. 分清楚 類別屬性實例屬性
  4. 了解 self 的意義。
  5. 學會不同的方法種類(實例方法、類別方法、靜態方法)。
  6. 初步接觸 OOP 的四大精神(封裝、繼承、多型、抽象)。

透過這些基礎,你會發現程式不只是「一堆函式」,而是能以更貼近現實世界的方式來建模,讓結構清楚、可讀性更高,並且更容易擴充。

1. 為什麼要學「物件導向」?

到目前為止,我們的程式都是「一堆函式」和「一些變數」。
可是當功能多起來時,會變得很難管理。
物件導向(OOP) 就是幫我們整理程式碼的一種方法。

你可以把它想像成:「先有一份藍圖,再照藍圖蓋出很多房子」。


2. 基本觀念(先用生活例子)

  • 類別(Class):食譜、建築藍圖
  • 物件(Object):做出來的蛋糕、蓋出來的房子
  • 屬性(Attribute):蛋糕的大小/口味;房子的顏色/坪數
  • 方法(Method):切蛋糕、開門關窗
  • self:方法裡的「這一個自己」
  • __init__:建構子,物件剛出生時就會自動跑一次,負責初始化

一句話:類別是規格,物件是產品


3. 第一個範例

class person:
    def __init__(self, name, age):   # 物件建立時會自動呼叫
        self.name = name
        self.age = age

    def say_hi(self):
        print(f"嗨!我是 {self.name},我 {self.age} 歲。")

Cool = person("JR", 25)   # 建立物件
Cool.say_hi()          # 呼叫方法

Python 自動把 mimi 傳給 self,所以你呼叫 mimi.say_hi() 時不用自己寫 self


4. 類別屬性 vs. 實例屬性

class Pet:
    species = "動物"   # 類別屬性

    def __init__(self, name):
        self.name = name  # 實例屬性

a = Pet("小花")
b = Pet("小黑")

print(a.species, b.species)  # 動物 動物
Pet.species = "寵物"
print(a.species, b.species)  # 寵物 寵物

類別屬性大家共用,實例屬性各自不同。

-- 類別屬性就像「大家共用的一份規則」,所有物件都會看到同一個值;
-- 實例屬性則像「每個人專屬的身份證」,各自獨立、互不影響。
注意:如果你在某個物件上直接改同名屬性,其實是「多加了一個新的實例屬性」。


5. 存取修飾(命名慣例)

class Person:
    def __init__(self, name, age, id_number):
        self.name = name       # 公開
        self._age = age        # 建議保護,不要隨便改
        self.__id = id_number  # 私有(會被名稱修飾)

Python 的屬性存取其實靠「慣例」:單底線 _ 代表不建議外部直接用,雙底線 __ 則會觸發名稱修飾避免衝突,但仍能繞過存取,並非真正私有。
Python 沒有真的「私有」,只是透過「名稱修飾」讓你不小心動不到。


6. 特殊方法

有些方法名字長得很奇怪,像是 __str__
這些叫 特殊方法(magic method),會在特定情況下自動被呼叫。

class Pet:
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return f"這是一隻叫 {self.name} 的寵物"
print(Pet("阿毛"))  # 這是一隻叫 阿毛 的寵物

7. 方法的種類

在 Python 的 class 中,常見有 三種方法

  1. 實例方法(Instance Method)
  2. 類別方法(Class Method)
  3. 靜態方法(Static Method)

1. 實例方法(Instance Method)

class Tool:
    def instance_method(self):
        print(f"跟著物件 {self} 走")

t = Tool()
t.instance_method()       #  正常呼叫
Tool.instance_method(t)   #  也可這樣呼叫,但少用
  • 定義:第一個參數是 self,代表「物件本身」。
  • 用途:操作物件的屬性或呼叫其他方法。
  • 重點物件存在才有意義

2. 類別方法(Class Method)

class Tool:
    kind = "工具"

    @classmethod
    def class_method(cls):
        print(f"跟著類別 {cls.__name__} 走,種類是 {cls.kind}")

Tool.class_method()   #  類別呼叫
t = Tool()
t.class_method()      #  物件呼叫,但語意較弱
  • 定義:第一個參數是 cls,代表「類別本身」。
  • 用途:操作「整個類別的屬性」或建立工廠方法(factory)。
  • 重點影響整個類別,而非單一物件

3. 靜態方法(Static Method)

class Tool:
    @staticmethod
    def static_method(x, y):
        print(f"完全獨立:{x + y}")

Tool.static_method(3, 5)  #  類別呼叫
t = Tool()
t.static_method(3, 5)     #  物件呼叫
  • 定義:沒有 selfcls,就是單純的函式。
  • 用途:工具性質功能,不依賴物件或類別狀態。
  • 重點像工具箱裡的獨立工具

8. OOP 的四大精神(先聽名字就好)

  1. 封裝:資料和功能包在一起
  2. 繼承:子類別可以沿用父類別
  3. 多型:不同類別可以有相同方法名字
  4. 抽象:只看「能做什麼」,不必管「怎麼做」

這些會在 Day 7 詳細談。


9. 小專案:學生與教室

class Student:
    def __init__(self, name, score):
        self.name, self.score = name, score

class Classroom:
    def __init__(self):
        self.students = []
    def add(self, student):
        self.students.append(student)
    def average(self):
        return sum(s.score for s in self.students) / len(self.students)

s1 = Student("Jr", 80)
s2 = Student("Sam", 90)
room = Classroom()
room.add(s1)
room.add(s2)
print("平均:", room.average())

物件可以互相合作,這就是 OOP 真正的威力。


上一篇
Day 5:函式、參數、回傳值與文件字串
下一篇
Day 7:物件導向 Part 2 (繼承、多型、`super()`、封裝 `@property`、抽象類別)
系列文
一塊一塊拼湊的 AI 樂高世界之旅8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言