第十一章面向對象編程基礎
Python 是一種典型的面向對象編程語言(OOP, Object-Oriented Programming)。從數據到函數,再到對象,是程序設計思想的自然演進的結果。
在面向對象編程中,我們不再僅僅編寫函數處理數據,而是讓“對象”同時擁有屬性(數據)與方法(行為),使程序組織更加清晰、可復用、可擴展。
學習目標:
(1)理解類與對象的基本概念與關系。
(2)掌握類的定義、實例化、屬性與方法的使用。
(3)理解封裝機制與信息隱藏的意義。
(4)了解繼承與方法重寫的基本思想。
(5)理解多態與抽象類的設計動機。
(6)能編寫簡單的面向對象程序,如學生管理、圖形建模或 AI 模型結構原型等。
11.1 面向對象編程概論
隨著程序規模擴大,僅依靠變量、函數和基本數據結構(列表、字典等)難以管理復雜邏輯。OOP 提供了一種更高層次的建模方式,使我們能夠用“類”來描述事物,用“對象”來表達實際存在。
對象具有兩類基本特征:
? 屬性(Attributes):描述是什么或擁有什么。
? 方法(Methods):描述對象能做什么或如何行動。
在 OOP 中,我們關注的不僅是數據本身,更關注對象的職責與行為。
OOP 的四大核心特性:
? 抽象(Abstraction)
關注“做什么”,而非“怎么做”。屏蔽內部實現,只暴露必要接口。
? 封裝(Encapsulation)
將數據與操作數據的方法打包為整體,封裝是實現抽象的重要手段,可使得對象成為可復用、可維護的模塊。
? 繼承(Inheritance)
代碼復用與層次化建模,通用的共性行為可抽象到基類,具體差異由子類實現。
? 多態(Polymorphism)
同一接口,不同實現。同一操作作用于不同類型的對象時,能夠自動觸發適合該類型的具體行為。
OOP 通過抽象、封裝、繼承與多態四大特性,將復雜系統分解為可理解、可復用、可擴展的模塊,提升代碼的結構性與可維護性。
掌握 OOP 意味著擁有拆解大型問題、構建長期價值系統的核心能力,是現代軟件工程的核心思維方式。
11.2 類與對象
11.2.1 類與對象的基本概念
類(Class):對某類事物的抽象描述,是對象的“模板”。
對象(Object / Instance):類的具體存在,是實際可用的實體。
例如:
類:Student
對象:某個具體學生,如“艾婉婷”
Python “一切皆對象”,數值、字符串、函數、模塊甚至類本身,都是對象。
示例:
# 輸出:汪汪!11.2.1.1類的定義
類通過 class 關鍵字定義:
# 類體內容:類變量、實例變量以及方法等定義語句類名推薦使用“大寫開頭的駝峰命名法”,如 Student、Teacher、AIModel 等。
類體不能為空。如果在定義類時,尚未設計好類的屬性和方法,可使用 pass 占位:
pass11.2.1.2實例化與初始化方法
利用定義好的類創建對象的過程稱為“實例化”:
變量名 = 類名(參數列表)括號中的參數會傳遞給類的初始化方法 __init__()。
要注意的是:
? __init__ 是初始化方法(initializer),在對象創建后運行,用于設置實例狀態;
? 真正的構造(allocation)由 __new__ 完成,通常不需要重寫除非進行自定義內存分配或不可變類型初始化。
示例:
# 輸出:艾婉婷 的成績是 95 分。不是關鍵字,而是約定俗成的命名,表示當前實例,會由 Python 自動傳入,用于訪問實例的屬性與方法。
11.2.2 實例屬性與類屬性
類的屬性可分為兩類:類屬性和實例屬性。
11.2.2.1類屬性
類屬性是在類體中直接定義的變量,位于類的頂層作用域內。
比如:
shared = []類屬性屬于類本身,所有該類的實例共享同一份數據。
(1)可以通過 類名.類屬性名 直接訪問或修改類屬性。
(2)若通過 實例.類屬性名 = 值 形式賦值,并不會修改類屬性,而是在該實例上創建一個同名的實例屬性,從而“屏蔽”掉類屬性。
(3)若類屬性是可變對象(如 list、dict 等),所有實例共享同一個對象。若某一實例中修改該可變對象會影響所有實例。
示例(警示):
print(x2.shared) # 會看到 [1]若需每個實例有獨立的可變數據,應在 __init__() 中創建實例屬性。
11.2.2.2實例屬性
實例屬性通常在初始化方法 __init__() 中定義。
=
<值>
實例屬性用于描述實例的個性化數據,每個實例都有自己獨立的副本。
(1)可以通過 實例.屬性名 訪問屬性。
(2)當通過 實例.屬性名 = 值 進行賦值時,若該實例屬性已存在則修改,若不存在則動態創建新的實例屬性(即使存在同名的類屬性)。
示例:
print(Robot.category) # 輸出: AI (類屬性本身不變)11.2.2.3 屬性查找順序
屬性查找的順序是:
實例屬性 → 類屬性 → 基類(按 MRO 順序)→ object
若使用多重繼承,基類的查找順序由類的 MRO(Method Resolution Order,方法解析順序) 決定。
11.2.3 實例方法、類方法與靜態方法
類中的方法類型與第一個參數有關。
11.2.3.1實例方法
實例方法至少包含一個參數,通常命名為 self,指向調用該方法的實例。
# self 指向實例本身實例方法通常通過對象實例調用,例如 obj.method()。主要用于操作對象的狀態。
示例:
print(c1.count)實例方法也可以通過類來調用,但需要顯式傳入實例,比如:
Counter.increment(c1) 這在調試或元編程中偶爾有用,但不推薦在常規代碼中使用。
11.2.3.2類方法
類方法使用 @classmethod 裝飾,其第一個參數通常命名為 cls,指向類對象本身。
# cls 指向類對象本身類方法是作用于類本身而非具體實例的方法。通過 cls,類方法可以訪問和修改類屬性,也可以調用其他類方法。
類方法既可以通過類名調用,也可以通過實例調用。后者會將類作為第一個參數自動傳入,但語義上應通過類調用以體現“操作類”的意圖。
示例:
Counter.show_total() # 當前計數器數量:5類方法常用于操作類級狀態、實現備用構造器或工廠方法。
p = Person.from_string("艾婉婷,18")11.2.3.3靜態方法
靜態方法使用 @staticmethod 裝飾,既沒有 self 也沒有 cls 參數,本質上是一個與類邏輯相關聯的普通函數。
...靜態方法既可以通過類名直接調用,也可以通過實例調用,但其行為與調用者無關。
示例:
print(mytool.add(5,3)) # 通過實例調用靜態方法通常用于工具函數或與類概念相關但不訪問類/實例狀態的操作。
11.2.4 魔術方法
(Special/Magic Methods)以雙下劃線 __ 包圍,例如 __init__ 初始化、__str__ 字符串顯示、__eq__ 比較運算、__len__ 長度、__add__ 加法、__iter__ 迭代支持,等等。
通過實現這些方法,自定義對象可像內建類型一樣被操作與組合。
示例:
print(p1 == p2) # 調用 __eq__()輸出:
True魔術方法支持運算符重載、屬性訪問、迭代和上下文管理等 Python 操作語義下的行為。
11.2.5 類與對象綜合示例與應用
例 11.2.1:溫度轉換器類
項目描述:設計一個類,實現攝氏度與華氏度之間的轉換功能。
t.show()輸出:
36.5°C = 97.7°F該示例演示了如何在類中定義屬性與方法,讓對象自身具備轉換能力。
例 11.2.2:AI 模型類
項目描述:定義一個 AIModel 類,用于表示人工智能模型的基本信息與推理行為。
model.predict("[圖片數據...]")輸出:
[ImageNetClassifier v1.2] 正在處理輸入數據:[圖片數據...]通過類的封裝,可以方便地管理 AI 模型的元數據與方法接口,這是 AI 系統中最常見的對象化設計模式之一。
例 11.2.3:任務執行計數器
項目描述:實現一個計數器類,用于統計任務的執行次數。
TaskCounter.show_total()輸出:
已執行任務總數:2此例展示了類屬性與類方法的結合使用,非常適合在批量任務調度或日志統計中使用。
小結
本次課介紹了面向對象編程的基本思想與關鍵構成要素。類是對事物的抽象描述,對象是類的實例。通過 __init__ 方法可初始化實例,通過實例屬性與類屬性區分“個體數據”和“共享數據”,通過實例方法、類方法與靜態方法實現不同的職責分工。魔術方法使類的行為更符合 Python 的對象協議。
類與對象為程序提供了新的抽象層,使我們能夠以“事物”的思維組織邏輯。
下一課將進一步探討封裝、繼承特性,使對象系統形成結構化、可復用的層次體系。
“點贊有美意,贊賞是鼓勵”
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.