lesson21:Python面向對象編程

目錄

引言

一、了解面向對象編程(OOP):編程范式的革命

1.1 什么是面向對象編程?

1.2 OOP vs 面向過程:思維方式的差異

1.3 OOP的三大核心特性

二、類與對象:OOP的基石

2.1 類(Class):對象的“藍圖”

2.2 對象(Object):類的“實體”

2.3 實戰:設計一個簡單的圖書管理系統

三、面向對象的進階實踐

3.1 封裝的最佳實踐:私有屬性與訪問控制

3.2 類方法與靜態方法

四、為什么選擇面向對象編程?

五、總結與進階方向


引言

在編程世界中,面向對象編程(OOP)是一種將現實世界復雜問題抽象為“對象”的思維方式。Python作為一門支持多范式的語言,不僅提供了簡潔的OOP語法,更通過類與對象的設計讓代碼具備更強的復用性、可維護性和擴展性。本文將從核心概念出發,結合實戰案例,帶你深入理解Python面向對象編程的精髓。


?一、了解面向對象編程(OOP):編程范式的革命

1.1 什么是面向對象編程?

OOP的核心思想是**“以對象為中心”**,將數據(屬性)和操作數據的行為(方法)封裝為一個整體。每個對象既是信息的載體,也是功能的執行者。這種思想模擬了現實世界中“事物”的存在方式——例如,一輛汽車有顏色、速度等屬性,也有加速、剎車等行為。

1.2 OOP vs 面向過程:思維方式的差異

  • 面向過程:關注“步驟”,按流程拆解任務(如“先做A,再做B”),適合簡單線性問題(如腳本工具)。
  • 面向對象:關注“實體”,將問題拆解為相互交互的對象(如“用戶”“訂單”“商品”),適合復雜系統(如電商平臺、游戲開發)。

舉例

  • 面向過程實現“學生成績管理”:定義函數錄入成績()計算平均分()打印報表()
  • 面向對象實現:創建Student類(屬性:姓名/成績;方法:錄入/計算/打印),通過實例化對象完成操作。

1.3 OOP的三大核心特性

  • 封裝:隱藏對象內部細節,僅通過公共接口交互(如用getter/setter方法控制屬性訪問)。
  • 繼承:子類復用父類代碼并擴展功能(如Student類繼承Person類的name屬性)。
  • 多態:不同對象對同一方法的不同實現(如Animal類的speak()方法,貓實現為“喵喵”,狗實現為“汪汪”)。

二、類與對象:OOP的基石

2.1 類(Class):對象的“藍圖”

類是對一類事物的抽象描述,定義了對象的屬性(變量)?和方法(函數)。例如,“人類”類可抽象為:

class Person:
# 類屬性:所有實例共享的特征
species = "智人" # 類屬性def __init__(self, name, age): # 構造方法:初始化實例屬性
self.name = name # 實例屬性(每個對象獨有)
self.age = agedef greet(self): # 實例方法:對象的行為
return f"你好,我是{self.name},今年{self.age}歲。"
  • 類屬性:定義在類中、方法外,所有實例共享(如species)。
  • 實例屬性:定義在__init__方法中,通過self.屬性名綁定,每個對象獨立(如name)。
  • 方法:類中定義的函數,需包含self參數(指代實例自身)。

2.2 對象(Object):類的“實體”

對象是類的具體實例,通過類名()創建。例如,基于Person類創建兩個對象:

# 實例化對象
alice = Person("Alice", 25)
bob = Person("Bob", 30)# 訪問屬性
print(alice.name) # 輸出:Alice(實例屬性)
print(Person.species) # 輸出:智人(類屬性)# 調用方法
print(bob.greet()) # 輸出:你好,我是Bob,今年30歲。
  • 對象的本質:一個存儲屬性和方法引用的內存單元。
  • 類與對象的關系:類是模板,對象是根據模板創建的具體產品(如“汽車圖紙”與“具體汽車”)。

2.3 實戰:設計一個簡單的圖書管理系統

為了深化理解,我們通過一個案例將類與對象結合:

class Book:
def __init__(self, title, author, isbn):
self.title = title
self.author = author
self.isbn = isbn
self.is_borrowed = False # 默認未借出def borrow(self):
if not self.is_borrowed:
self.is_borrowed = True
return f"《{self.title}》借閱成功!"
return f"《{self.title}》已被借出。"def return_book(self):
if self.is_borrowed:
self.is_borrowed = False
return f"《{self.title}》歸還成功!"
return f"《{self.title}》未被借出。"# 使用示例
book1 = Book("Python編程:從入門到實踐", "埃里克·馬瑟斯", "9787115428028")
print(book1.borrow()) # 輸出:《Python編程:從入門到實踐》借閱成功!
print(book1.borrow()) # 輸出:《Python編程:從入門到實踐》已被借出。

三、面向對象的進階實踐

3.1 封裝的最佳實踐:私有屬性與訪問控制

Python通過命名約定實現封裝:

  • _開頭的屬性/方法:約定為“私有”,不建議外部直接訪問(如_secret)。
  • __開頭的屬性/方法:觸發名稱修飾(Name Mangling),外部無法直接訪問(如__password)。

示例

class User:
def __init__(self, username, password):
self.username = username
self.__password = password # 私有屬性def get_password(self):
return "******" # 隱藏真實密碼def set_password(self, new_password):
if len(new_password) >= 8:
self.__password = new_password
return "密碼更新成功"
return "密碼長度需≥8位"user = User("alice", "12345678")
print(user.get_password()) # 輸出:******
print(user.set_password("short")) # 輸出:密碼長度需≥8位

3.2 類方法與靜態方法

除了實例方法,類還支持兩種特殊方法:

  • 類方法:用@classmethod裝飾,參數為cls(指代類本身),用于操作類屬性。
  • 靜態方法:用@staticmethod裝飾,無默認參數,類似獨立函數,與類/實例無關。

示例

class MathUtils:
pi = 3.14159 # 類屬性@classmethod
def update_pi(cls, new_value):
cls.pi = new_value # 修改類屬性@staticmethod
def add(a, b):
return a + b # 獨立功能# 使用類方法
MathUtils.update_pi(3.14)
print(MathUtils.pi) # 輸出:3.14# 使用靜態方法
print(MathUtils.add(2, 3)) # 輸出:5

四、為什么選擇面向對象編程?

  1. 代碼復用:通過繼承減少重復代碼。
  2. 模塊化:每個類負責單一功能,便于調試和維護。
  3. 可擴展性:新增功能只需添加新類,不影響原有代碼(開閉原則)。
  4. 模擬現實:更符合人類對復雜系統的認知方式(如用Car類模擬汽車,Order類模擬訂單)。

五、總結與進階方向

本文從概念到實戰,帶你掌握了Python面向對象的核心——類與對象的設計。要真正內化OOP思維,建議:

  1. 多寫實戰代碼:嘗試用類封裝一個小游戲(如貪吃蛇)或工具(如日志管理器)。
  2. 學習設計模式:如單例模式(確保類只有一個實例)、工廠模式(統一創建對象)等。
  3. 深入高級特性:探索屬性裝飾器(@property)、元類(metaclass)等黑魔法。

面向對象編程不僅是一種語法,更是一種解決問題的哲學。當你能用“對象”的視角拆解復雜問題時,便真正邁入了Python編程的進階之門。

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

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

相關文章

基于卷積神經網絡與小波變換的醫學圖像超分辨率算法復現

基于卷積神經網絡與小波變換的醫學圖像超分辨率算法復現 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家,覺得好請收藏。點擊跳轉到網站。 1. 引言 醫學圖像超分辨率技術在臨床診斷和治療規劃…

HCIP第一二章筆記整理

第一章:復習HCIA第一階段應用層:自然語言轉換為編碼表示層:編碼轉換為二進制介質訪問控制層:二進制轉化為信號物理層:傳輸電信號第二階段:OSI參考模型應用層:提供網絡服務表示層:對數…

《使用Qt Quick從零構建AI螺絲瑕疵檢測系統》——2. C++基礎:構建程序的堅實骨架

目錄一、概述1.1 背景介紹:從UI到邏輯1.2 學習模式:Qt控制臺應用二、C語法快速入門2.1 變量、數據類型與注釋2.2 函數與代碼封裝2.3 循環與容器:批量處理三、面向對象編程:封裝數據與行為四、Qt的核心擴展:信號與槽通信…

Navicat 遠程連接SQLlite數據庫

1、SQLlite數據庫是一個本地.db文件,默認不支持遠程連接; 2、Navicat 可以通過ntunnel_sqlite.php文件連接遠程SQLlite庫; 3、安裝Navicat,安裝完成,在安裝目錄下找到ntunnel_sqlite.php文件; 4、上傳當前文…

OpenCV用于計算光流的一個類cv::optflow::DualTVL1OpticalFlow

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 cv::optflow::DualTVL1OpticalFlow 是 OpenCV 中用于計算光流的一個類,特別地,它實現了基于雙幀 TV-L1(Total V…

PyQt5在Pycharm上的環境搭建 -- Qt Designer + Pyuic + Pyrcc組合,大幅提升GUI開發效率

軟件安裝 目標軟件: Python解釋器Pycharm編輯器 Python官網: 點擊訪問Python官網 Pycharm官網:點擊訪問Pycharm官網 環境搭建 搭建完成后最終的環境詳情: python安裝路徑:D:\ProgramEnviron\Python\Python311Pyth…

30天打牢數模基礎-卷積神經網絡講解

案例代碼實現一、代碼說明本案例使用PyTorch實現一個改進版LeNet-5模型,用于CIFAR-10數據集的圖像分類任務。代碼包含以下核心步驟:數據加載與預處理(含數據增強,劃分訓練/驗證/測試集);定義CNN網絡結構&am…

Dev-C++——winAPI貪吃蛇小游戲

🚀歡迎互三👉:霧狩 💎💎 🚀關注博主,后期持續更新系列文章 🚀如果有錯誤感謝請大家批評指出,及時修改 🚀感謝大家點贊👍收藏?評論? 今天水一篇吧…

【openbmc6】entity-manager

文章目錄 2.1 事件監聽:dbus在linux上使用的底層通信方式多半是unix domain socket ,事件的到來可被抽象為:socket上有數據,可讀 2.2 事件處理:由于主線程肯定有邏輯得跑,因此新開一個線程甚至多個線程專門用來監聽和處理事件,但存在多線程就意味著可能存在競爭,存在競…

Java 實現 UDP 多發多收通信

在網絡通信領域,UDP(用戶數據報協議)以其無連接、高效率的特點,在實時通信場景中占據重要地位。本文將結合一段實現 UDP 多發多收的 Java 代碼,詳細解析其實現邏輯,幫助開發者深入理解 UDP 通信的底層邏輯與…

Java學習第六十二部分——Git

目錄 一、關鍵概述 二、核心概念 三、常用命令 四、優勢因素 五、應用方案 六、使用建議 一、關鍵概述 提問:Git 是什么? 回答:一句話,分布式版本控制系統(DVCS),用來跟蹤文件&#…

CDN和DNS 在分布式系統中的作用

一、DNS:域名系統(Domain Name System) 1. 核心功能 DNS是互聯網的“地址簿”,負責將人類易記的域名(如www.baidu.com)解析為計算機可識別的IP地址(如180.101.50.242)。沒有DNS&…

uniapp用webview導入本地網頁,ios端打開頁面空白問題

目前還沒解決,DCloud官方也說不行 IOS下webview加載本地網頁時,無法加載資源 - DCloud問答

軟考 系統架構設計師系列知識點之面向服務架構設計理論與實踐(8)

接前一篇文章:軟考 系統架構設計師系列知識點之面向服務架構設計理論與實踐(7) 所屬章節: 第15章. 面向服務架構設計理論與實踐 第3節 SOA的參考架構 15.3 SOA的參考架構 IBM的Websphere業務集成參考架構(如圖15-2所示,以下簡稱參考架構)是典型的以服務為中心的企業集…

基于 Docker 及 Kubernetes 部署 vLLM:開啟機器學習模型服務的新篇章

在當今數字化浪潮中,機器學習模型的高效部署與管理成為眾多開發者和企業關注的焦點。vLLM 作為一款性能卓越的大型語言模型推理引擎,其在 Docker 及 Kubernetes 上的部署方式如何呢?本文將深入探討如何在 Docker 及 Kubernetes 集群中部署 vL…

工業互聯網六大安全挑戰的密碼“解法”

目錄 工業互聯網密碼技術應用Q&A Q1:設備身份認證與接入控制 Q2:通信數據加密與完整性保護 Q3:遠程安全訪問 Q4:平臺與數據安全 Q5:軟件與固件安全 Q6:日志審計與抗抵賴 首傳信安-解決方案 總…

基于springboot的在線問卷調查系統的設計與實現(源碼+論文)

一、開發環境 1 Java語言 Java語言是當今為止依然在編程語言行業具有生命力的常青樹之一。Java語言最原始的誕生,不僅僅是創造者感覺C語言在編程上面很麻煩,如果只是專注于業務邏輯的處理,會導致忽略了各種指針以及垃圾回收這些操作&#x…

民法學學習筆記(個人向) Part.1

民法學學習筆記(個人向) Part.1有關民法條文背后的事理、人心、經濟社會基礎;民法的結構民法學習的特色就是先學最難的民法總論,再學較難的物權法、合同法等,最后再學習最簡單的婚姻、繼承、侵權部分。這是一個由難到易的過程,尤為…

ElasticSearch Doc Values和Fielddata詳解

一、Doc Values介紹倒排索引在搜索包含指定 term 的文檔時效率極高,但在執行相反操作,比如查詢一個文檔中包含哪些 term,以及進行排序、聚合等與指定字段相關的操作時,表現就很差了,這時候就需要用到 Doc Values。倒排…

【C語言】解決VScode中文亂碼問題

文章目錄【C語言】解決VScode中文亂碼問題彈出無法寫入用戶設置的處理方法彈出無法在只讀編輯器編輯的問題處理方法【C語言】解決VScode中文亂碼問題 💬歡迎交流:在學習過程中如果你有任何疑問或想法,歡迎在評論區留言,我們可以共…