面向對象編程(OOP)是 Python 中最重要的編程范式之一,它將數據和操作數據的方法封裝在一起,提高了代碼的復用性和可維護性。本文將結合實際代碼示例,詳細講解 Python 面向對象編程的核心概念和常用技巧。
一、類與對象的基本概念
1.1 面向過程與面向對象的區別
- 面向過程:像 "蛋炒飯",步驟緊密耦合,一步接著一步執行(如打開冰箱→放入大象→關閉冰箱)
- 面向對象:像 "蓋澆飯",將功能封裝成獨立組件(如冰箱類負責開關,大象類負責進出)
1.2 類與對象的定義
- 類:是對象的抽象模板,包含一類事物的共有特征(屬性)和行為(方法)
- 對象:是類的實例化,是具體的事物
# 定義Student類
class Student:# 構造方法:創建對象時自動執行,初始化實例屬性def __init__(self, name, age):self.name = name # 實例屬性self.age = age # 實例屬性# 實例方法:定義對象的行為def show_info(self):print(self.name, self.age)# 創建對象(實例化)
zs = Student('張三', 20)
ls = Student('李四', 22)# 訪問屬性和方法
print(zs.name) # 輸出:張三
zs.show_info() # 輸出:張三 20
提示:self
代表當前對象,誰調用方法就指代誰
二、類屬性與實例屬性
屬性分為兩種:類屬性和實例屬性,它們的作用域和訪問方式有所不同。
import mathclass Circle:PI = math.pi # 類屬性:屬于類,所有對象共享def __init__(self, r):self.r = r # 實例屬性:每個對象獨有的屬性# 訪問類屬性
print(Circle.PI) # 方式1:類名.屬性名,輸出:3.14159...
c1 = Circle(2)
print(c1.PI) # 方式2:對象名.屬性名(不推薦,建議用類名訪問)# 訪問實例屬性
print(c1.r) # 只能通過對象訪問,輸出:2
區別總結:
- 類屬性:所有對象共享,定義在類中、方法外
- 實例屬性:每個對象獨有,定義在
__init__
方法中 - 類屬性推薦用
類名.屬性名
訪問,實例屬性用對象名.屬性名
訪問
三、三大方法類型:實例方法、類方法、靜態方法
3.1 實例方法
- 第一個參數必須是
self
(指代當前對象) - 可訪問實例屬性和類屬性
- 通過
對象名.方法名()
調用
def show(self): # 實例方法print(f"實例屬性:{self.n},類屬性:{self.count}")
3.2 類方法
- 用
@classmethod
裝飾器標識 - 第一個參數必須是
cls
(指代當前類) - 主要用于操作類屬性,不能直接訪問實例屬性
- 通過
類名.方法名()
調用
@classmethod
def set_count(cls): # 類方法cls.count += 1 # 操作類屬性
3.3 靜態方法
- 用
@staticmethod
裝飾器標識 - 沒有默認參數(不需要
self
或cls
) - 不能直接訪問實例屬性,可通過
類名.類屬性
訪問類屬性 - 更像獨立的工具函數,與類和對象關聯較弱
- 通過
類名.方法名()
調用
@staticmethod
def check_str(s): # 靜態方法return s == s[::-1] # 判斷回文串
四、對象的字符串表示
當我們打印對象時,默認顯示的是內存地址,通過__str__
和__repr__
可以自定義對象的字符串形式。
import jsonclass Student:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):# 用于print輸出,更友好的字符串return json.dumps(self.__dict__, ensure_ascii=False)def __repr__(self):# 用于解釋器顯示(如在列表中),通常與__str__保持一致return self.__str__()zs = Student('張三', 20)
print(zs) # 輸出:{"name": "張三", "age": 20}
print([zs]) # 輸出:[{"name": "張三", "age": 20}](因__repr__生效)
區別:
__str__
:面向用戶,側重可讀性__repr__
:面向開發者,側重準確性(調試用)
五、類的魔術方法
Python 中以__
開頭和結尾的方法稱為魔術方法,它們在特定場景下自動調用。
5.1 構造與初始化
__new__
:創建對象(先執行)__init__
:初始化對象屬性(后執行)
class Student:def __new__(cls, *args, **kwargs):print('創建對象...')return super().__new__(cls) # 必須返回創建的對象def __init__(self, name, age):print('初始化屬性...')self.name = nameself.age = age
5.2 運算符重載
通過魔術方法可以自定義對象的運算符行為:
class Student:def __init__(self, age):self.age = agedef __add__(self, other): # 定義+運算return self.age + other.agedef __gt__(self, other): # 定義>運算return self.age > other.agezs = Student(20)
ls = Student(30)
print(zs + ls) # 輸出:50(調用__add__)
print(zs > ls) # 輸出:False(調用__gt__)
常用運算符魔術方法:
- 算術:
__add__
(+)、__sub__
(-)、__mul__
(*)、__truediv__
(/) - 比較:
__gt__
(>)、__lt__
(<)、__eq__
(==)、__ne__
(!=)
六、獲取類與對象的信息
在開發和調試中,我們常需要查看類和對象的信息,常用方法如下:
class Student:"""學生類"""def __init__(self, name, age):self.name = nameself.age = agezs = Student('張三', 20)# 查看對象屬性字典
print(zs.__dict__) # 輸出:{'name': '張三', 'age': 20}# 查看對象/類的所有成員
print(dir(zs)) # 對象的所有屬性和方法
print(dir(Student)) # 類的所有成員# 類的元信息
print(Student.__name__) # 類名:Student
print(Student.__doc__) # 類文檔:學生類
print(Student.__base__) # 父類:<class 'object'>
七、實戰案例:商品庫存管理
下面通過一個商品管理類,綜合應用上述知識:
class Product:def __init__(self, name, stock):self.name = name # 商品名稱self.stock = stock # 庫存def add_stock(self, quantity):"""增加庫存"""self.stock += quantitydef reduce_stock(self, quantity):"""減少庫存,庫存不足時提示"""if quantity > self.stock:print("庫存不足")else:self.stock -= quantitydef display_stock(self):"""顯示當前庫存"""return self.stock# 使用示例
p = Product('筆', 50)
p.add_stock(10)
print(p.display_stock()) # 輸出:60
p.reduce_stock(12)
print(p.display_stock()) # 輸出:48
總結
面向對象編程是 Python 開發的核心技能,本文介紹了類與對象、屬性與方法、魔術方法等關鍵知識點。掌握這些概念后,你可以編寫出更模塊化、更易維護的代碼。記住,多練習是掌握面向對象編程的關鍵,嘗試將這些知識應用到實際項目中吧!