什麼是面向對象編程?¶
想象一下,你想做一個簡單的遊戲,比如“打氣球”。傳統的編程思路可能是先寫“檢測氣球是否被點擊”,再寫“氣球移動”,再寫“計分”……這些代碼散落在不同的地方,就像一堆零散的零件。但如果用面向對象的思路,你會把“氣球”本身看作一個獨立的“角色”——它有自己的顏色、大小(這些是“屬性”),還有“移動”“被點擊則消失”(這些是“行爲”)。這樣把數據和行爲封裝在一個“對象”裏,是不是更像我們現實中觀察世界的方式?
面向對象編程(OOP,Object-Oriented Programming)就是以“對象”爲核心,把問題拆解成一個個對象,每個對象負責自己的屬性和行爲。Python 是一門支持面向對象的語言,理解類和對象是進入 Python 面向對象世界的第一步。
Python中的“類”是什麼?¶
“類”(Class)就像一張“設計圖”或“模板”,用來描述對象的共同特徵和行爲。比如“動物”是一個類,它包含所有動物的共同屬性(比如有生命、會呼吸)和行爲(比如跑、叫);而具體的“貓”“狗”就是這個類的一個個“對象”(實例)。
在 Python 中,我們用 class 關鍵字定義一個類。比如定義一個“汽車”類:
class Car:
# 這裏將定義汽車的屬性和方法
pass # pass 表示暫時沒有內容,先佔位
這個 Car 類現在是空的,我們需要給它加上“屬性”和“方法”。
類的組成:屬性與方法¶
屬性:對象的“特徵”,就像汽車有顏色、品牌、速度等特徵,在 Python 中表現爲類中的變量。
方法:對象的“行爲”,就像汽車可以“行駛”“加油”,在 Python 中表現爲類中的函數(注意:類中的函數叫“方法”,不是普通函數)。
1. 定義屬性¶
我們給 Car 類加上一些屬性,比如 color(顏色)、speed(速度)。爲了讓每個對象的屬性能獨立初始化,我們需要用 構造方法 __init__(這是 Python 的特殊方法,會在創建對象時自動調用)。
class Car:
# 構造方法:初始化對象的屬性
def __init__(self, color, brand):
# self 是一個特殊參數,代表對象本身(比如當前這輛車)
self.color = color # 實例屬性:顏色
self.brand = brand # 實例屬性:品牌
self.speed = 0 # 初始速度爲0
__init__方法的第一個參數必須是self,它指向當前對象,就像“這輛車自己”。- 當我們創建對象時,
__init__會自動運行,傳入的參數(如color和brand)會被賦值給self的屬性。
2. 定義方法¶
給 Car 類加上“行爲”,比如 drive(行駛)和 stop(停止):
class Car:
def __init__(self, color, brand):
self.color = color
self.brand = brand
self.speed = 0
# 行駛方法:加速
def drive(self, speed_increase):
self.speed += speed_increase
print(f"{self.brand}的{self.color}汽車正在加速,當前速度:{self.speed}")
# 停止方法:減速到0
def stop(self):
self.speed = 0
print(f"{self.brand}的{self.color}汽車已停止,速度:{self.speed}")
這裏的 drive 和 stop 就是 Car 類的“方法”,每個對象(實例)都可以調用這些方法。
從類到對象:實例化¶
有了類之後,我們需要創建具體的對象(實例化),就像根據“汽車設計圖”造出一輛輛具體的汽車。
# 創建對象:調用類名(),並傳入構造方法需要的參數
my_car = Car("紅色", "特斯拉") # 實例化一個 Car 對象,顏色紅色,品牌特斯拉
# 訪問屬性:通過對象.屬性名
print(my_car.color) # 輸出:紅色
print(my_car.brand) # 輸出:特斯拉
# 調用方法:通過對象.方法名()
my_car.drive(50) # 輸出:特斯拉的紅色汽車正在加速,當前速度:50
my_car.drive(30) # 輸出:特斯拉的紅色汽車正在加速,當前速度:80
my_car.stop() # 輸出:特斯拉的紅色汽車已停止,速度:0
關鍵點:每個對象(如 my_car)都有自己獨立的屬性值,修改一個對象的屬性不會影響其他對象。
爲什麼需要 self?¶
self 是 Python 中一個“約定俗成”的參數,它的作用是讓方法知道“操作的是哪個對象”。比如 my_car.drive(50) 中,self 會自動指向 my_car,所以 self.speed 就是 my_car 的 speed 屬性。如果沒有 self,方法就無法區分是哪個對象的屬性,會報錯。
小練習:定義一個“學生”類¶
嘗試自己寫一個簡單的 Student 類,包含:
- 屬性:name(姓名)、age(年齡)、score(分數)
- 方法:study()(學習,分數+10)、introduce()(自我介紹,打印姓名、年齡、分數)
class Student:
def __init__(self, name, age, score=0): # score 默認值爲0
self.name = name
self.age = age
self.score = score
def study(self):
self.score += 10
print(f"{self.name} 學習後,分數變爲:{self.score}")
def introduce(self):
print(f"我叫{self.name},今年{self.age}歲,分數是{self.score}分")
# 創建學生對象
student1 = Student("小明", 15, 80)
student1.introduce() # 輸出:我叫小明,今年15歲,分數是80分
student1.study() # 輸出:小明 學習後,分數變爲:90
student1.introduce() # 輸出:我叫小明,今年15歲,分數是90分
總結¶
- 類(Class) 是對象的模板,定義了對象的屬性和方法。
- 對象(Object) 是類的實例,是具體的“東西”,有自己的屬性值。
- 屬性 是對象的特徵(變量),方法 是對象的行爲(函數)。
__init__是構造方法,用於初始化對象屬性;self指向當前對象,是方法的第一個參數。
面向對象編程的核心思想是“封裝”,即把數據和操作數據的方法放在一起,讓代碼更模塊化、易維護。後續我們會學習更復雜的概念(如繼承、多態),但先打好類與對象的基礎吧!