【Python】Python 面向對象編程詳解?

Python 面向對象編程詳解?


文章目錄

  • Python 面向對象編程詳解?
  • 前言
  • 一、面向對象的基本概念?
    • 1.1 類(Class)?
    • 1.2 對象(Object)?
    • 1.3 屬性(Attribute)?
    • 1.4 方法(Method)?
  • 二、類的定義與對象的創建?
    • 2.1 類的定義?
    • 2.2 對象的創建?
  • 三、構造方法與屬性初始化?
    • 3.1 構造方法的語法
    • 3.2 構造方法的使用舉例
    • 3.3 帶有默認參數的構造方法?
  • 四、類的屬性和方法分類?
    • 4.1 屬性分類?
    • 4.2 方法分類?
  • 五、繼承?
    • 5.1 單繼承?
    • 5.2 多繼承?
  • 六、封裝與訪問控制?
  • 七、多態?
  • 總結?


前言

面向對象編程(Object-Oriented Programming,簡稱 OOP)是一種重要的編程范式,它將數據和操作數據的方法封裝在一起,以對象為核心來組織代碼。Python 作為一門支持面向對象編程的語言,提供了簡潔而強大的面向對象特性,讓開發者能夠更高效地構建復雜應用。


一、面向對象的基本概念?

1.1 類(Class)?

類是對具有相同屬性和方法的一類事物的抽象描述,它定義了該類對象所共有的屬性和方法。可以把類看作是一個模板,通過這個模板可以創建出具體的對象。類不僅包含了數據(屬性),還包含了操作這些數據的函數(方法),這使得數據和操作能夠緊密結合。?

例如,“汽車” 可以看作一個類,它具有顏色、品牌、型號、發動機排量等屬性,還有行駛、剎車、轉彎、加速等方法。這些屬性和方法是所有汽車都具備的共性特征,只是不同汽車的屬性值和方法的具體表現可能不同。

1.2 對象(Object)?

對象是類的實例化結果,是具體存在的事物。一個類可以創建出多個對象,每個對象都具有該類所定義的屬性和方法,但屬性的值可能不同。對象是類的具體體現,通過對象可以實現類所定義的功能。?

例如,根據 “汽車” 類,可以創建出 “一輛紅色的特斯拉 Model 3,發動機排量為 2.0T”“一輛黑色的寶馬 X5,發動機排量為 3.0T” 等具體的汽車對象。這些對象都屬于 “汽車” 類,但各自的屬性值不同,執行方法時的表現也可能有所差異。

1.3 屬性(Attribute)?

屬性是類或對象所具有的特征,用于描述對象的狀態。在類中定義的屬性是該類所有對象共有的特征,每個對象可以有不同的屬性值。屬性可以分為不同的類型,如基本數據類型(整數、字符串、布爾值等)、復合數據類型(列表、字典、元組等),甚至可以是其他對象。?

例如,“汽車” 類的 “顏色” 屬性可以是字符串類型(如 “紅色”“黑色”),“發動機排量” 屬性可以是浮點數類型(如 2.0、3.0)。

1.4 方法(Method)?

方法是類中定義的函數,用于描述對象的行為,即對象可以執行的操作。方法可以操作類或對象的屬性,實現特定的功能。與普通函數不同,方法需要通過類或對象來調用,并且方法中通常包含一個特殊的參數(如self、cls),用于引用類或對象本身。?

例如,“汽車” 類的 “行駛” 方法可以改變汽車的位置屬性,“加速” 方法可以提高汽車的速度屬性。

類與對象關系示意圖:?
類與對象關系示意圖


二、類的定義與對象的創建?

2.1 類的定義?

在 Python 中,使用class關鍵字來定義類,基本語法如下:?

class 類名:# 類的屬性定義類屬性1 =1類屬性2 =2# ...# 類的方法定義def 方法名1(self, 參數1, 參數2, ...):# 方法體passdef 方法名2(self, 參數1, 參數2, ...):# 方法體pass# ...?

其中,類名通常采用駝峰命名法(每個單詞的首字母大寫,不使用下劃線),這是 Python 中類命名的慣例,便于區分類和函數。類屬性是該類所有對象共有的屬性,定義在方法之外;方法定義在類內部,第一個參數通常是self,用于引用實例對象。

2.2 對象的創建?

創建對象的過程稱為實例化,只需使用類名加括號即可。在實例化時,可以根據類的構造方法(如果有的話)傳遞參數,用于初始化對象的屬性。

舉例:?

# 定義汽車類
class Car:# 類的屬性category = "交通工具"  # 所有汽車都屬于交通工具類別color = "白色"  # 默認顏色為白色brand = "未知品牌"model = "未知型號"# 類的方法def drive(self):"""描述汽車行駛的行為"""print(f"{self.brand}{self.model}正在道路上行駛")def brake(self):"""描述汽車剎車的行為"""print(f"{self.brand}{self.model}正在剎車,車速逐漸降低")def accelerate(self, speed_increase):"""描述汽車加速的行為,參數為增加的速度"""print(f"{self.brand}{self.model}加速,速度增加了{speed_increase}km/h")# 創建汽車對象
car1 = Car()
car2 = Car()# 訪問對象的屬性
print(f"car1的顏色:{car1.color}")  # 輸出:car1的顏色:白色
print(f"car2的品牌:{car2.brand}")  # 輸出:car2的品牌:未知品牌
print(f"car1的類別:{car1.category}")  # 輸出:car1的類別:交通工具# 修改對象的屬性值
car1.color = "紅色"
car1.brand = "特斯拉"
car1.model = "Model 3"
car2.color = "黑色"
car2.brand = "寶馬"
car2.model = "X5"print(f"修改后car1的顏色:{car1.color}")  # 輸出:修改后car1的顏色:紅色
print(f"修改后car2的品牌:{car2.brand}")  # 輸出:修改后car2的品牌:寶馬# 調用對象的方法
car1.drive()  # 輸出:特斯拉Model 3正在道路上行駛
car2.brake()  # 輸出:寶馬X5正在剎車,車速逐漸降低
car1.accelerate(20)  # 輸出:特斯拉Model 3加速,速度增加了20km/h

三、構造方法與屬性初始化?

為了在創建對象時能夠為對象的屬性賦初始值,避免創建對象后再逐個修改屬性的繁瑣操作,Python 提供了構造方法__init__。構造方法是一種特殊的方法,在對象被創建時自動調用,用于初始化對象的屬性。

3.1 構造方法的語法

class 類名:def __init__(self, 參數1, 參數2, ..., 參數n):# 初始化實例屬性self.屬性1 = 參數1self.屬性2 = 參數2# ...self.屬性n = 參數n# 其他方法定義

其中,self代表類的實例對象,在調用方法時不需要手動傳遞,Python 會自動將當前對象作為self參數傳遞給方法。參數 1 到參數 n 是用于初始化對象屬性的值,在創建對象時需要傳遞這些參數。

3.2 構造方法的使用舉例

class Car:# 類屬性category = "交通工具"def __init__(self, color, brand, model, displacement):"""構造方法,初始化汽車的顏色、品牌、型號和發動機排量屬性"""self.color = colorself.brand = brandself.model = modelself.displacement = displacement  # 發動機排量def drive(self):print(f"{self.color}{self.brand}{self.model}(排量{self.displacement}T)正在行駛")def get_info(self):"""獲取汽車的詳細信息"""return f"汽車信息:顏色-{self.color},品牌-{self.brand},型號-{self.model},排量-{self.displacement}T"# 創建對象時傳遞參數,初始化屬性
car1 = Car("紅色", "特斯拉", "Model 3", 2.0)
car2 = Car("黑色", "寶馬", "X5", 3.0)car1.drive()  # 輸出:紅色的特斯拉Model 3(排量2.0T)正在行駛
print(car2.get_info())  # 輸出:汽車信息:顏色-黑色,品牌-寶馬,型號-X5,排量-3.0T

在上面的例子中,創建car1和car2對象時,通過構造方法直接為color、brand、model和displacement屬性賦值,相比創建對象后再修改屬性更加高效。

3.3 帶有默認參數的構造方法?

在構造方法中,可以為參數設置默認值,這樣在創建對象時,如果不需要修改該參數的值,就可以不傳遞該參數。

class Car:category = "交通工具"def __init__(self, color="白色", brand="未知品牌", model="未知型號", displacement=1.5):self.color = colorself.brand = brandself.model = modelself.displacement = displacementdef get_info(self):return f"汽車信息:顏色-{self.color},品牌-{self.brand},型號-{self.model},排量-{self.displacement}T"# 創建對象時不傳遞所有參數,使用默認值
car3 = Car()
print(car3.get_info())  # 輸出:汽車信息:顏色-白色,品牌-未知品牌,型號-未知型號,排量-1.5T# 創建對象時傳遞部分參數
car4 = Car("藍色", "豐田")
print(car4.get_info())  # 輸出:汽車信息:顏色-藍色,品牌-豐田,型號-未知型號,排量-1.5T

四、類的屬性和方法分類?

4.1 屬性分類?

?

屬性類型?定義位置訪問方式?特點?舉例?
實例屬性__init__方法中或對象中??對象、屬性名?每個對象的屬性值可以不同,屬于對象私有?self.color = color?
類屬性?類中,__init__方法外?類名、屬性名 或 對象、屬性名?所有對象共享該屬性值,屬于類共有?class Car: wheels = 4(所有汽車都有 4 個輪子)?

舉例:?

class Car:?wheels = 4  # 類屬性,所有汽車都有4個輪子??def __init__(self, color, brand):?self.color = color  # 實例屬性?self.brand = brand  # 實例屬性?
?
car1 = Car("紅色", "特斯拉")?
car2 = Car("黑色", "寶馬")?
?
print(Car.wheels)  # 輸出:4?
print(car1.wheels)  # 輸出:4?
print(car2.color)  # 輸出:黑色?
print(car1.brand)  # 輸出:特斯拉?

4.2 方法分類?

方法類型?定義方式?調用方式?特點?舉例?
實例方法?def 方法名(self, 參數…):?對象、方法名 ()?依賴于對象,能訪問實例屬性和類屬性?前面例子中的drive()、brake()?
類方法?@classmethod
def 方法名(cls, 參數…):?
類名、方法名 () 或 對象、方法名 ()?依賴于類,能訪問類屬性,不能直接訪問實例屬性?用于操作類屬性的方法?
靜態方法?@staticmethod
def 方法名(參數…):?
類名、方法名 () 或 對象、方法名 ()?不依賴于類和對象,不能直接訪問類屬性和實例屬性?與類相關的工具函數?

舉例:?

class Car:wheels = 4  # 類屬性def __init__(self, brand):self.brand = brand  # 實例屬性# 實例方法def get_brand(self):return self.brand# 類方法@classmethoddef change_wheels(cls, num):cls.wheels = num# 靜態方法@staticmethoddef is_car(vehicle):return isinstance(vehicle, Car)car1 = Car("特斯拉")# 調用實例方法
print(car1.get_brand())  # 輸出:特斯拉# 調用類方法
Car.change_wheels(6)
print(Car.wheels)  # 輸出:6# 調用靜態方法
print(Car.is_car(car1))  # 輸出:True
print(Car.is_car("不是汽車"))  # 輸出:False

五、繼承?

繼承是面向對象編程的重要特性,它允許一個類(子類)繼承另一個類(父類)的屬性和方法,從而實現代碼的復用。子類可以在父類的基礎上添加新的屬性和方法,或重寫父類的方法。?

5.1 單繼承?

子類只繼承一個父類。?

語法:?

class 子類名(父類名):?# 子類的屬性和方法?pass?

舉例:??

class Vehicle:?def __init__(self, color):?self.color = color??def move(self):?print(f"{self.color}的交通工具在移動")?
?
# 子類:汽車,繼承自交通工具?
class Car(Vehicle):?def __init__(self, color, brand):?# 調用父類的構造方法?super().__init__(color)?self.brand = brand??# 重寫父類的move方法?def move(self):?print(f"{self.color}{self.brand}汽車在公路上行駛")?
?
car = Car("紅色", "特斯拉")?
car.move()  # 輸出:紅色的特斯拉汽車在公路上行駛?

5.2 多繼承?

子類可以繼承多個父類。?

語法:

class 子類名(父類名1, 父類名2, ...):?# 子類的屬性和方法?pass?

?舉例:?

class Flyable:?def fly(self):?print("可以飛行")?
?
class Swimmable:?def swim(self):?print("可以游泳")?
?
# 子類:水陸空三棲車,繼承自Flyable和Swimmable?
class AmphibiousCar(Flyable, Swimmable):?pass?
?
car = AmphibiousCar()?
car.fly()  # 輸出:可以飛行?
car.swim()  # 輸出:可以游泳?

?
繼承關系示意圖:?

繼承關系示意圖


六、封裝與訪問控制?

封裝是指將對象的屬性和方法隱藏起來,只提供有限的接口供外部訪問,從而保證數據的安全性。在 Python 中,通過命名約定來實現訪問控制。?

  • 公有屬性和方法:默認情況下,屬性和方法都是公有的,可以通過對象直接訪問。?
  • 私有屬性和方法:在屬性或方法名前加上兩個下劃線__,私有屬性和方法只能在類的內部訪問,外部不能直接訪問。?

舉例:?

class Person:?def __init__(self, name, age):?self.name = name  # 公有屬性?self.__age = age  # 私有屬性??def get_age(self):  # 公有方法,用于獲取私有屬性?return self.__age??def __secret(self):  # 私有方法?print("這是一個秘密")?
?
person = Person("張三", 25)?
print(person.name)  # 輸出:張三?
print(person.get_age())  # 輸出:25?
# print(person.__age)  # 報錯,不能直接訪問私有屬性?
# person.__secret()  # 報錯,不能直接調用私有方法?

七、多態?

多態是指不同的對象對同一方法調用做出不同的響應。在繼承的基礎上,子類重寫父類的方法,當調用該方法時,會根據對象的實際類型執行相應的方法。?

舉例:?

class Animal:def make_sound(self):passclass Dog(Animal):def make_sound(self):print("汪汪汪")class Cat(Animal):def make_sound(self):print("喵喵喵")def animal_sound(animal):animal.make_sound()dog = Dog()
cat = Cat()animal_sound(dog)  # 輸出:汪汪汪
animal_sound(cat)  # 輸出:喵喵喵

在上面的例子中,Dog和Cat都繼承自Animal,并重寫了make_sound方法。當調用animal_sound函數時,傳入不同的動物對象,會執行不同的make_sound方法,體現了多態的特性。?


總結?

  • Python 面向對象編程通過類、對象、繼承、封裝和多態等特性,提供了一種靈活、高效的代碼組織方式。類是對象的模板,對象是類的實例;繼承實現了代碼復用;封裝保證了數據安全;多態提高了代碼的靈活性。?
  • 掌握面向對象編程思想,能夠幫助我們設計出更清晰、更易于維護和擴展的程序,尤其在開發大型項目時,優勢更為明顯。通過不斷實踐,我們可以更好地理解和運用這些特性,編寫出高質量的 Python 代碼。?

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

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

相關文章

Redis 緩存和 Redis 分布式鎖

目錄 Redis 緩存 (Caching) 目的 核心邏輯 存儲形式總結 典型場景 Redis 分布式鎖 (Distributed Lock) 目的 核心作用 核心邏輯 典型場景 核心區別總結 Redis 緩存 (Caching) 在Redis中,數據是以鍵值對的形式存儲的,其中鍵總是字符串類型&…

[ java 基礎 ] 了解編程語言的第一步

目錄 一. IDE (1). 使用IDE的原因: (2). 創建和使用: (3). 常用快捷方式與設置 (4). 注釋 (5). 關鍵字 (6). 標識符 (7). 變量 (8). 數據類型 1) 整數類型 2) 浮點類型 3) 布爾類型(boolean) 4) 字符類型(char) 5) 字符串 6) 基本數據類之間的轉換 (9). 運算符…

JavaScript 閉包與遞歸深度解析:從理論到實戰

本文將系統梳理 JavaScript 中閉包與遞歸的核心概念、實戰應用及面試要點,涵蓋課堂知識點、作業實現、面試題解析等內容,幫助你全面掌握這兩大重要概念。 一、閉包:函數與變量的綁定藝術 1.1 閉包的定義與核心特性 閉包是 JavaScript 中一種特殊的語言現象,其核心定義可…

牛 CDR3 單抗:抗病毒領域的 “納米級精準導彈”

一、病毒防御的天然克星病毒感染的核心難題在于其表面的 “糖衣炮彈”—— 以 HIV 為例,其 Env 蛋白表面密集的糖鏈形成物理屏障,傳統抗體難以穿透。而牛 CDR3 單抗的超長 CDR H3 結構(50-60 個氨基酸)如同 “納米探針”&#xff…

鴻蒙應用開發和Vue網頁開發中生命周期的區別

因為下節課就可以寫講解兩者生命周期代碼的實戰了,寫介紹一下理論方面的區別:鴻蒙應用開發(ArkUI范式)與Vue網頁開發在生命周期管理上的核心區別,這直接反映了原生OS應用與Web應用在架構哲學和運行環境上的根本差異??…

基于SpringBoot+Vue的輕手工創意分享平臺(WebSocket即時通訊、協同過濾算法、Echarts圖形化分析)

🎈系統亮點:WebSocket即時通訊、協同過濾算法、Echarts圖形化分析;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架 項目架構:B/S架構 運行環境:win10/win11、jdk17前端&#xff1…

Java應屆生求職八股(5)---并發編程篇

線程基礎線程與進程的區別進程是程序的一次執行過程。它資源分配的單位。線程是程序執行的單位。并行和并發的區別單核CPU下,線程串行。(并發:多線程輪流使用一個或多個CPU)多核CPU下,每個核都可調度線程。&#xff08…

WSL 配置文件 wsl.conf 設置

WSL .wslconfig 小技巧 要在 WSL(Windows Subsystem for Linux)中增加內存,你需要編輯 WSL 配置文件 wsl.conf 或者直接調整虛擬機的資源限制。 文章目錄WSL .wslconfig 小技巧以下是步驟: 找到或創建 .wslconfig 文件&#xff1…

9.從零開始寫LINUX內核——設置中斷描述符表

Linux 0.12 內核中斷描述符表(IDT)完整實現代碼以下是基于 setup 程序擴展的完整代碼,包含中斷描述符表(IDT)的定義、初始化及中斷處理程序,可直接用于實驗驗證:asm/* setup.s —— 4 扇區&…

手機實時提取SIM卡打電話的信令聲音-當前現狀與思考

手機實時提取SIM卡打電話的信令聲音-當前現狀與思考 --純手機-無外置配件的方案規劃 上一篇:手機實時提取SIM卡打電話的信令聲音-新的篇章(篇外小結與思考) 下一篇:手機實時提取SIM卡打電話的信令聲音-整體解決方案規劃 一、前言 我們在2024年09月的…

【車聯網kafka】常用參數及其命令總結(第八篇)

目錄 1、kafka參數 1.1 、消費者消息批次發送 1.2 、消息大小的配置(環環相扣的消息大小,調整時需要一起調整) 1.3 、消息重試發送冪等 1.4、消息提交 1.5、分區分配策略(自己看的設置) 1.6、文件存儲 2、kafka命令 2.1 常用命令一覽…

基于Spring Boot 4s店車輛管理系統 租車管理系統 停車位管理系統 智慧車輛管理系統

🔥作者:it畢設實戰小研🔥 💖簡介:java、微信小程序、安卓;定制開發,遠程調試 代碼講解,文檔指導,ppt制作💖 精彩專欄推薦訂閱:在下方專欄&#x1…

17.4 合并購物車

分析 用戶登錄后,將Cookie中的購物車商品合并到redis數據庫中。如果此時redis中已經有相同id的商品,則使用Cookie中的數據覆蓋redis中的數據。 合并功能需要在用戶登錄后實現,但登錄視圖中應避免過多與登錄邏輯無關的邏輯,所以考慮…

RK3588消費級8K VR一體機 是否有坑?

??芯片平臺????定位場景????核心優勢????消費級功能性短板??全志H8/RK3288入門級VR低成本、基礎性能穩定算力弱(4*A55)、無NPU、顯示分辨率僅1080P高通XR1中端VR/AR均衡性能(Adreno 615 GPU)僅WiFi5、續航≤4小時…

基于Spring Boot校園二手交易平臺系統設計與實現 二手交易系統 交易平臺小程序

🔥作者:it畢設實戰小研🔥 💖簡介:java、微信小程序、安卓;定制開發,遠程調試 代碼講解,文檔指導,ppt制作💖 精彩專欄推薦訂閱:在下方專欄&#x1…

Nginx 服務器常用操作

一. Nginx 常用配置 1. Nginx 總配置文件 nginx 安裝目錄下的 nginx.conf 文件: # 指定 Nginx worker 進程運行的系統用戶 user nginx; # 自動根據 CPU 核心數啟動相應數量的 worker 進程,充分利用多核。 worker_processes auto; # 自動將 worker 進程綁定到特定 …

PHP官方及第三方下載地址全指南(2025最新版)

PHP官方及第三方下載地址全指南(2025最新版) 本文整理了PHP官方及主流第三方下載渠道,包含PHP 5.5至8.4各版本的直接下載鏈接,助您快速獲取安全可靠的PHP環境。 一、PHP官方下載渠道 1.1 全球主站下載 網址:https://…

深度剖析Redisson分布式鎖項目實戰

今天在練手項目中也是遇到了許多新的技術,其中我認為最深刻的還是Redisson分布式鎖,這里我就結合一下我項目中用到Redisson分布式鎖的代碼來講述一下Redisson分布式鎖,希望可以幫助大家更深刻地理解這項技術。在之前的文章中我已經講過Rediss…

第四天-創建一個Classic CAN(經典CAN2.0)/CANFD的系統描述ARXML文件

【ARXML專題】-構建CAN/CANFD通信系統:ARXML實戰指南 汽車神經系統的"高速公路" 想象一輛現代汽車如同人體,電子控制單元(ECU)是器官,而CAN總線就是連接它們的神經系統。在自動駕駛時代,傳統CAN2.0的"鄉間小路"已無法滿足數據傳輸需求,CANFD的"…

用架構建模工具Sparx EA繪制企業轉型路線圖

企業數字化轉型面臨諸多挑戰:信息壁壘導致各部門協同困難,資源投入缺乏科學評估,潛在風險難以提前預判。這些問題不僅拖慢轉型進程,還可能引發高昂的試錯成本。 本文將闡述如何運用架構建模工具Sparx EA的核心功能——可視化路線…