Python 面向對象編程核心知識點深度解析

面向對象編程(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裝飾器標識
  • 沒有默認參數(不需要selfcls
  • 不能直接訪問實例屬性,可通過類名.類屬性訪問類屬性
  • 更像獨立的工具函數,與類和對象關聯較弱
  • 通過類名.方法名()調用
@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 開發的核心技能,本文介紹了類與對象、屬性與方法、魔術方法等關鍵知識點。掌握這些概念后,你可以編寫出更模塊化、更易維護的代碼。記住,多練習是掌握面向對象編程的關鍵,嘗試將這些知識應用到實際項目中吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92063.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92063.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92063.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java學習第一百部分——Kafka

目錄 一、前言提要 二、核心價值 三、核心架構 四、基本用途 五、優勢總結 六、相關技術 七、詳細用途 八、高級用法 九、最佳實踐 十、總結定位 一、前言提要 Apache Kafka 是一個強大的開源分布式流處理平臺&#xff0c;專為處理高吞吐量、低延遲的實時數據流而設計…

[spring-cloud: 負載均衡]-源碼分析

獲取服務列表 ServiceInstanceListSupplier ServiceInstanceListSupplier 接口是一個提供 ServiceInstance 列表的供應者&#xff0c;返回一個響應式流 Flux<List<ServiceInstance>>&#xff0c;用于服務發現。 public interface ServiceInstanceListSupplier e…

Oracle 在線重定義

Oracle 在線重定義&#xff08;Online Redefinition&#xff09; 是一種功能&#xff0c;通過DBMS_REDEFINITION 包提供&#xff0c;允許DBA在不需要停止或顯著影響數據庫正常操作的情況下&#xff0c;對數據庫表進行結構化修改。可以實現的功能將表移動到其它表空間增加、修改…

Web 開發 12

1 網址里的 “搜索請求” 結構 這張圖是在教你怎么看懂 網址里的 “搜索請求” 結構&#xff0c;特別基礎但超重要&#xff0c;對你學前端幫別人做搜索功能超有用&#xff0c;用大白話拆成 3 步講&#xff1a; 1. 先看「協議&#xff08;Protocol&#xff09;」 HTTPS 就是瀏…

網絡安全 | 如何構建一個有效的企業安全響應團隊

網絡安全 | 如何構建一個有效的企業安全響應團隊 一、前言 二、團隊組建的基礎要素 2.1 人員選拔 2.2 角色定位 三、團隊應具備的核心能力 3.1 技術專長 3.2 應急處置能力 3.3 溝通協作能力 四、團隊的運作機制 4.1 威脅監測與預警流程 4.2 事件響應流程 4.3 事后復盤與改進機制…

HTTP、WebSocket、TCP、Kafka等通訊渠道對比詳解

在當今互聯的數字世界中&#xff0c;通信渠道是系統、應用程序和設備之間數據交換的支柱。從傳統的HTTP和TCP協議到專為特定場景設計的Kafka和MQTT等平臺&#xff0c;這些通信方式滿足了從實時消息傳遞到大規模數據流處理的多樣化需求。本文將深入探討主要的通信協議和平臺。一…

臭氧、顆粒物和霧霾天氣過程的大氣污染物計算 CAMx模型

隨著我國經濟快速發展&#xff0c;我國面臨著日益嚴重的大氣污染問題。大氣污染是工農業生產、生活、交通、城市化等方面人為活動的綜合結果&#xff0c;同時氣象因素是控制大氣污染的關鍵自然因素。大氣污染問題既是局部、當地的&#xff0c;也是區域的&#xff0c;甚至是全球…

數據結構(13)堆

目錄 1、堆的概念與結構 2、堆的實現 2.1 向上調整算法&#xff08;堆的插入&#xff09; 2.2 向下調整算法&#xff08;堆的刪除&#xff09; 2.3 完整代碼 3、堆的應用 3.1 堆排序 3.2 Top-K問題 1、堆的概念與結構 堆是一種特殊的二叉樹&#xff0c;根結點最大的堆稱…

C++模板知識點3『std::initializer_list初始化時逗號表達式的執行順序』

std::initializer_list初始化時逗號表達式的執行順序 在使用Qt Creator4.12.2&#xff0c;Qt5.12.9 MinGW開發的過程中發現了一個奇怪的現象&#xff0c;std::initializer_list<int>在初始化構造時的執行順序反了&#xff0c;經過一番測試發現&#xff0c;其執行順序可正…

【Unity3D】Shader圓形弧度裁剪

片元著色器&#xff1a; float3 _Center float3(0, 0, 0); float3 modelPos i.modelPos;// float angle atan2(modelPos.y - _Center.y, modelPos.x - _Center.x); // 計算角度&#xff0c;范圍-π到π float angle atan2(modelPos.y - _Center.y, modelPos.z - _Center.z)…

curl發送文件bodyParser無法獲取請求體的問題分析

問題及現象 開發過程使用curlPUT方式發送少量數據, 后端使用NodeJSexpress框架bodyParser,但測試發現無法獲取到請求體內容,現象表現為req.body 為空對象 {} 代碼如下: const bodyParser require(body-parser); router.use(/api/1, bodyParser.raw({limit: 10mb, type: */*}))…

Vue3 學習教程,從入門到精通,Vue 3 內置屬性語法知識點及案例代碼(25)

Vue 3 內置屬性語法知識點及案例代碼 Vue 3 提供了豐富的內置屬性&#xff0c;幫助開發者高效地構建用戶界面。以下將詳細介紹 Vue 3 的主要內置屬性&#xff0c;并結合詳細的案例代碼進行說明。每個案例代碼都包含詳細的注釋&#xff0c;幫助初學者更好地理解其用法。1. data …

機器學習基石:深入解析線性回歸

線性回歸是機器學習中最基礎、最核心的算法之一&#xff0c;它為我們理解更復雜的模型奠定了基礎。本文將帶你全面解析線性回歸的方方面面。1. 什么是回歸&#xff1f; 回歸分析用于預測連續型數值。它研究自變量&#xff08;特征&#xff09;與因變量&#xff08;目標&#xf…

OneCodeServer 架構深度解析:從組件設計到運行時機制

一、架構概覽與設計哲學1.1 系統定位與核心價值OneCodeServer 作為 OneCode 平臺的核心服務端組件&#xff0c;是連接前端設計器與后端業務邏輯的橋梁&#xff0c;提供了從元數據定義到應用程序執行的完整解決方案。它不僅是一個代碼生成引擎&#xff0c;更是一個全生命周期管理…

Jwts用于創建和驗證 ??JSON Web Token(JWT)?? 的開源庫詳解

Jwts用于創建和驗證 ??JSON Web Token&#xff08;JWT&#xff09;?? 的開源庫詳解在 Java 開發中&#xff0c;提到 Jwts 通常指的是 ??JJWT&#xff08;Java JWT&#xff09;庫??中的核心工具類 io.jsonwebtoken.Jwts。JJWT 是一個專門用于創建和驗證 ??JSON Web To…

如果發送的數據和接受的數據不一致時,怎么辦?

那ART4222這個板卡舉例&#xff0c;我之間輸入一個原始數據“6C532A14”&#xff0c;但是在選擇偶校驗時&#xff0c;接收的是“6C532B14”&#xff0c;我發送的碼率&#xff08;運行速度&#xff09;是100000&#xff0c;但接受的不穩定&#xff0c;比如&#xff1b;“100100.…

ISCC認證:可持續生產的新標桿。ISCC如何更快認證

在全球可持續發展浪潮中&#xff0c;ISCC&#xff08;國際可持續與碳認證&#xff09;體系已成為企業綠色轉型的重要工具。這一國際公認的認證系統覆蓋農業、林業、廢棄物處理等多個領域&#xff0c;通過嚴格的可持續性標準、供應鏈可追溯性要求和碳排放計算規范&#xff0c;建…

想對學習自動化測試的一些建議

Python接口自動化測試零基礎入門到精通&#xff08;2025最新版&#xff09;接觸了不少同行&#xff0c;由于他們之前一直做手工測試&#xff0c;現在很迫切希望做自動化測試&#xff0c;其中不乏工作5年以上的人。 本人從事軟件自動化測試已經近5年&#xff0c;從server端到web…

電子電氣架構 ---智能電動汽車嵌入式軟件開發過程中的block點

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

createAsyncThunk

下面&#xff0c;我們來系統的梳理關于 Redux Toolkit 異步操作&#xff1a;createAsyncThunk 的基本知識點&#xff1a;一、createAsyncThunk 概述 1.1 為什么需要 createAsyncThunk 在 Redux 中處理異步操作&#xff08;如 API 調用&#xff09;時&#xff0c;傳統方法需要手…