探索【Python面向對象】編程:新時代的高級編程范式詳解

目錄

1. 面向對象編程概念(OOP)

1.1 什么是類和對象?

1.2 類的定義

1.3 類和對象的關系

1.4 小李的理解

2. 抽象

2.1 抽象的概念

2.2 抽象類和方法

2.3 小李的理解

3. 類和實例

3.1 類的定義和實例化

3.2 類的屬性和方法

3.3 小李的理解

4. 封裝/接口

4.1 封裝的概念

4.2 接口的概念

4.3 小李的理解

5. 繼承

5.1 繼承的概念

5.2 方法重寫

5.3 小李的理解

6. 多態

6.1 多態的概念

6.2 實現多態

6.3 小李的理解

7. 自省/反射

7.1 自省的概念

7.2 使用自省進行動態操作

7.3 小李的理解

8. 靜態方法和類方法

8.1 靜態方法

8.2 類方法

總結


?

專欄:python學習筆記?

上一卷:Python模塊化與包管理

1. 面向對象編程概念(OOP)

面向對象編程(OOP) 是一種編程范式,通過將程序組織成對象的集合來實現。對象不僅包含數據,還包含操作這些數據的方法。OOP的核心概念包括類、對象、屬性和方法。

1.1 什么是類和對象?

  • 類(Class) 是一個模板或藍圖,用來創建對象。類定義了對象的屬性和行為。
  • 對象(Object) 是類的實例。創建對象就是根據類創建一個具體的實例。

例子:

class Dog:# 類的初始化方法def __init__(self, name, age):self.name = name  # 屬性self.age = age    # 屬性# 方法def bark(self):return f"{self.name} says Woof!"# 創建對象
my_dog = Dog("Rex", 5)
print(my_dog.bark())

1.2 類的定義

在Python中,類通過 class 關鍵字定義。類中的函數稱為方法,變量稱為屬性。類的方法通常以 self 作為第一個參數,表示實例本身。

例子:

class Cat:def __init__(self, name):self.name = namedef meow(self):return f"{self.name} says Meow!"# 創建對象
my_cat = Cat("Whiskers")
print(my_cat.meow())

1.3 類和對象的關系

類是對象的模板,定義了對象的結構和行為。而對象是類的實例,每個對象都有獨立的屬性和方法。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef greet(self):return f"Hello, my name is {self.name} and I am {self.age} years old."# 創建多個對象
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)print(person1.greet())
print(person2.greet())

1.4 小李的理解

類就像是制作餅干的模具,它定義了餅干的形狀和尺寸。而對象就像是用模具做出的具體餅干,每塊餅干可以有不同的口味(屬性),但它們的形狀和尺寸(結構和行為)都是相同的。

2. 抽象

抽象 是指對現實世界的復雜問題進行簡化,通過抓住主要特征而忽略細節。在編程中,抽象幫助我們創建更加簡潔和易維護的代碼。

2.1 抽象的概念

抽象就是提取對象的主要特征,而忽略不重要的細節。通過抽象,我們可以專注于對象的核心功能,而不被次要特征所干擾。

例子:

class Animal:def __init__(self, name):self.name = namedef make_sound(self):pass  # 抽象方法,不具體實現class Dog(Animal):def make_sound(self):return "Woof!"class Cat(Animal):def make_sound(self):return "Meow!"# 創建對象
dog = Dog("Rex")
cat = Cat("Whiskers")print(dog.make_sound())
print(cat.make_sound())

2.2 抽象類和方法

在Python中,我們可以通過定義抽象類和抽象方法來實現抽象。抽象類不能被實例化,只能被繼承。抽象方法在抽象類中定義,但在子類中實現。

例子:

from abc import ABC, abstractmethodclass Vehicle(ABC):@abstractmethoddef start_engine(self):passclass Car(Vehicle):def start_engine(self):return "Car engine started"class Motorcycle(Vehicle):def start_engine(self):return "Motorcycle engine started"# 創建對象
car = Car()
motorcycle = Motorcycle()print(car.start_engine())
print(motorcycle.start_engine())

2.3 小李的理解

抽象就像是把一幅復雜的畫簡化為幾何圖形。比如,一只具體的貓有很多特征(毛色、大小、年齡等),但我們只關注它會喵喵叫的特點,這就是對貓進行的抽象。

3. 類和實例

類和實例 是OOP的基礎。類是模板,實例是具體對象。實例通過類創建,具有類定義的屬性和方法。

3.1 類的定義和實例化

定義類并創建實例是OOP的基本操作。類定義了屬性和方法,而實例則是類的具體對象。

例子:

class Student:def __init__(self, name, grade):self.name = nameself.grade = gradedef introduce(self):return f"Hi, I am {self.name} and I am in grade {self.grade}."# 創建實例
student1 = Student("Alice", 10)
student2 = Student("Bob", 12)print(student1.introduce())
print(student2.introduce())

3.2 類的屬性和方法

類的屬性是對象的狀態,方法是對象的行為。類的屬性通過 __init__ 方法初始化,方法在類中定義。

例子:

class Book:def __init__(self, title, author):self.title = titleself.author = authordef get_info(self):return f"'{self.title}' by {self.author}"# 創建實例
book = Book("1984", "George Orwell")
print(book.get_info())

3.3 小李的理解

類和實例就像是房子的圖紙和實際的房子。圖紙(類)定義了房子的結構和功能,而實際的房子(實例)則是根據圖紙建造的具體對象。

4. 封裝/接口

封裝 是將對象的狀態(屬性)和行為(方法)隱藏在類內部,通過接口(方法)與外界交互。封裝提高了代碼的安全性和可維護性。

4.1 封裝的概念

封裝是OOP的核心概念之一,它通過隱藏對象的內部狀態,只暴露必要的接口,來保護對象的數據。這樣,外部代碼不能直接訪問或修改對象的內部狀態,只能通過對象提供的方法來操作數據。

例子:

class Account:def __init__(self, owner, balance=0):self.owner = ownerself.__balance = balance  # 私有屬性def deposit(self, amount):if amount > 0:self.__balance += amountelse:raise ValueError("Deposit amount must be positive")def withdraw(self, amount):if 0 < amount <= self.__balance:self.__balance -= amountelse:raise ValueError("Insufficient funds or invalid amount")def get_balance(self):return self.__balance# 創建實例
account = Account("John")
account.deposit(100)
print(account.get_balance())

4.2 接口的概念

接口是對象與外部交互的唯一方式。通過接口,外部代碼可以調用對象的方法,而不能直接訪問對象的內部狀態。

例子:

class Car:def __init__(self, model):self.model = modelself.__engine_started = Falsedef start_engine(self):if not self.__engine_started:self.__engine_started = Truereturn "Engine started"else:return "Engine is already running"def stop_engine(self):if self.__engine_started:self.__engine_started = Falsereturn "Engine stopped"else:return "Engine is not running"# 創建實例
car = Car("Toyota")
print(car.start_engine())
print(car.stop_engine())

4.3 小李的理解

封裝就像是手機的外殼。手機內部的電路和元件(對象的狀態)被封裝在外殼里面,用戶只能通過按鍵和屏幕(接口)與手機交互,而無法直接接觸內部的元件。

5. 繼承

繼承 是OOP的另一個核心概念,它允許我們基于一個現有的類創建一個新的類,新類繼承了現有類的所有屬性和方法。

5.1 繼承的概念

繼承是指一個類(子類)從另一個類(父類)獲取屬性和方法。通過繼承,子類可以復用父類的代碼,同時可以添加新的屬性和方法,或重寫父類的方法。

例子:

class Animal:def __init__(self, name):self.name = namedef speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"# 創建實例
dog = Dog("Rex")
cat = Cat("Whiskers")print(dog.speak())
print(cat.speak())

5.2 方法重寫

子類可以重寫父類的方法,即在子類中定義與父類同名的方法,從而實現不同的功能。

例子:

class Shape:def area(self):return 0class Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * (self.radius ** 2)# 創建實例
rectangle = Rectangle(3, 4)
circle = Circle(5)print(rectangle.area())
print(circle.area())

5.3 小李的理解

繼承就像是父母給孩子的遺產。父母(父類)把他們的財產(屬性和方法)傳給孩子(子類),孩子不僅可以使用這些財產,還可以通過自己的努力(添加新屬性和方法)變得更加富有。

6. 多態

多態 是指同一個方法在不同的對象上具有不同的表現形式。多態允許我們通過同一個接口調用不同對象的方法,從而實現不同的功能。

6.1 多態的概念

多態是OOP的重要特性之一,它通過父類引用指向子類對象,使得同一方法可以有不同的實現。多態提高了代碼的靈活性和可擴展性。

例子:

class Animal:def speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"def animal_sound(animal):print(animal.speak())# 創建實例
dog = Dog()
cat = Cat()animal_sound(dog)
animal_sound(cat)

?

6.2 實現多態

在Python中,多態通常通過方法重寫和父類引用來實現。通過父類引用指向子類對象,可以調用子類的方法。

例子:

class Shape:def draw(self):passclass Rectangle(Shape):def draw(self):return "Drawing a rectangle"class Circle(Shape):def draw(self):return "Drawing a circle"def draw_shape(shape):print(shape.draw())# 創建實例
rectangle = Rectangle()
circle = Circle()draw_shape(rectangle)
draw_shape(circle)

?

6.3 小李的理解

多態就像是萬能遙控器。無論是控制電視、空調還是音響,只要這些設備有相應的接口(方法),遙控器(父類引用)就能通過相同的按鍵(方法調用)實現不同的功能。

7. 自省/反射

自省 是指對象在運行時能夠知道自己的信息。Python提供了一些內置函數用于自省,如 type()id()hasattr() 等。

7.1 自省的概念

自省是指對象能夠在運行時獲取自身的信息,如屬性、方法等。自省使得Python程序具有高度的動態性和靈活性。

例子:

class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("Alice", 30)# 使用內置函數進行自省
print(type(person))
print(hasattr(person, "name"))
print(getattr(person, "name"))
setattr(person, "name", "Bob")
print(person.name)
delattr(person, "name")

7.2 使用自省進行動態操作

通過自省,我們可以在運行時動態地操作對象的屬性和方法,使得程序更加靈活和動態。

例子:

class Car:def __init__(self, model):self.model = modelself.speed = 0def accelerate(self):self.speed += 5return self.speedcar = Car("Toyota")# 動態操作對象
if hasattr(car, "accelerate"):method = getattr(car, "accelerate")print(method())print(method())# 動態設置屬性
setattr(car, "color", "red")
print(car.color)

7.3 小李的理解

自省就像是人在照鏡子。通過鏡子(自省機制),人可以看到自己的樣子(對象的屬性和方法),并根據需要進行調整(動態操作對象)。

8. 靜態方法和類方法

靜態方法類方法 是與類相關聯的方法,而不是與實例相關聯的方法。靜態方法使用 @staticmethod 裝飾器,類方法使用 @classmethod 裝飾器。

8.1 靜態方法

靜態方法是類的一個方法,但它不與任何類實例綁定。靜態方法不能訪問類的實例,也不能修改類的狀態。它們通常用于執行一些與類無關的操作,但邏輯上屬于類的功能。

例子:

class Math:@staticmethoddef add(a, b):return a + bprint(Math.add(5, 3))

?

8.2 類方法

類方法是綁定到類而不是實例的方法。類方法的第一個參數是類本身,通常命名為 cls。類方法可以訪問類的屬性和其他類方法。

例子:

class Math:factor = 2@classmethoddef multiply(cls, value):return cls.factor * valueprint(Math.multiply(5))

總結

Python的面向對象編程的各個方面,包括面向對象編程的基本概念、抽象、類和實例、封裝、繼承、多態、自省以及靜態方法和類方法。

希望這篇詳細的博客能幫助你深入理解Python的面向對象編程,并在實際項目中應用這些知識。如果你有任何問題或需要進一步的幫助,請隨時與我聯系!

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

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

相關文章

如何使用Python在企業微信中發送測試結果?操作看這里!

在日常的自動化測試工作中&#xff0c;一般會需要把測試結果同步到工作群里&#xff0c;方便信息同步。那么我們今天就使用企業微信和Pythonrequests庫來演示一下具體如何操作吧&#xff01; 01 準備 開始之前&#xff0c;我們應該確保已經安裝了python環境&#xff0c;并且要…

DNS知識點

??打牌 : da pai ge的個人主頁 ???個人專欄 : da pai ge的博客專欄 ??寶劍鋒從磨礪出,梅花香自苦寒來 ? 目錄 一、DNS概念 二 hosts 文件 三 DNS優缺點 三 客戶端域名解析順序(優先級)…

8.9分王者“水刊”!1區IEEE-Trans,國人主編坐鎮!發文量2倍增長,擴刊趨勢明顯!

關注GZH【歐亞科睿學術】&#xff0c;第一時間了解最新期刊動態&#xff01; 本期&#xff0c;小編給大家推薦的是一本IEEE旗下王者“水刊”。該期刊目前處于擴刊狀態&#xff0c;接收跨學科領域&#xff0c;領域認可度高&#xff0c;還可選擇非OA模式無需版面費&#xff0c;是…

PPTP、L2TP、IPSec、IPS 有什么區別?

隨著互聯網的發展&#xff0c;保護網絡通信的安全越來越重要。PPTP、L2TP、IPSec、IPS是常見的網絡安全協議和技術&#xff0c;在保護網絡通信安全方面發揮著不同的作用和特點。下面介紹PPTP、L2TP、IPSec、IPS之間的區別。 點對點隧道協議&#xff08;PPTP&#xff09;是一種用…

對素數的一種新理解

素數是除了1和它自身沒有其它因數的自然數&#xff08;不包括1&#xff09;。素數被認為是自然數的基礎&#xff0c;就像自然界的原子一樣&#xff0c;可以通過若干個素數的乘積表示所有大于1的自然數&#xff0c;而且這種表示是唯一的&#xff08;不考慮素數的順序&#xff09…

HTTP協議分析/burp/goby/xray

一、HTTP簡介 HTTP(超文本傳輸協議)是今天所有web應用程序使用的通信協議。最初&#xff0c;HTTP只是一個為獲取基于文本的靜態資源而開發的簡單協議&#xff0c;后來人們以名種形式擴展和利用它.使其能夠支持如今常見的復雜分布式應用程序。HTTP使用一種用于消息的模型:客戶端…

Golang異常處理機制

go語言使用error來處理錯誤&#xff0c;用panic和recover來處理異常 error go語言的錯誤處理有兩個發展階段&#xff0c;以go1.13版本為分水嶺&#xff0c;在1.13版本之前&#xff0c;標準庫對error的支持非常有限&#xff0c;僅有errors.New()和fmt.Errorf()兩個函數來構造e…

javaweb中的請求與響應--基于postman工具的應用(附帶postman的詳細安裝步驟)

一、前言 后端的第一天感覺難度就上來了&#xff0c;可能是基礎太過薄弱了吧。目前看視頻已經有點跟不上了&#xff0c;果然15天想要拿下還是太勉強了點。30天還差不多。不知道讀者們有沒有好好的去學這方面的知識&#xff0c;沒有什么是學不會的&#xff0c;關鍵是堅持。 Po…

幾個小創新模型,KAN組合網絡(LSTM、GRU、Transformer)回歸預測,python預測全家桶再更新!...

截止到本期&#xff0c;一共發了9篇關于機器學習預測全家桶Python代碼的文章。參考往期文章如下&#xff1a; 1.終于來了&#xff01;python機器學習預測全家桶 2.機器學習預測全家桶-Python&#xff0c;一次性搞定多/單特征輸入&#xff0c;多/單步預測&#xff01;最強模板&a…

蘿卜快跑的狠活

蘿卜快跑作為百度旗下的自動駕駛出行服務平臺&#xff0c;在科技應用上展現了多項領先的技術。以下是蘿卜快跑采用的一些主要科技“狠活”&#xff1a; 自動駕駛技術&#xff1a; 蘿卜快跑主要使用了百度Apollo的L4級自動駕駛技術&#xff0c;該技術能夠應對海量的城市道路場景…

C++:重定義

派生類和基類的同名成員問題 派生類中再實現一個基類中的方法會怎樣 (1)代碼實驗&#xff1a;派生類和基類中各自實現一個內容不同但函數原型完全相同的方法&#xff0c;會怎么樣 (2)結論&#xff1a;基類對象調用的是基類的方法&#xff0c;派生類對象調用執行的是派生類中重…

進程調度篇

在操作系統的廣闊領域中&#xff0c;進程調度是其中一個至關重要的環節。它如同操作系統的“交通警察”&#xff0c;負責在多個等待CPU執行的進程間進行高效、公平的分配。本文將帶您了解進程調度的基本概念、重要性、常用算法…… 1. 進程調度的基本概念 1.1 進程調度的定義 …

【FreeRTOS】freeRTOS的Tmr Svc任務優先級配置

1、Tmr Svc是個FreeRTOS的軟件定時器任務&#xff0c;他可以收集各任務的狀態 2、他的優先級可以通過宏 configTIMER_TASK_PRIORITY 來配置&#xff0c;默認是2 3、修改為31后&#xff0c;程序總是啟動不了&#xff0c; 4、后面才發現原來FreeRTOS的默認最大優先級號配置的是…

工具指南 - jenkins

一、接入SonarQube 掃描代碼 SonarQube是一個用于管理代碼質量的開放平臺&#xff0c;可以快速的定位代碼中潛在的或者明顯的錯誤。 1.1 源碼管理 如果源碼托管在SVN&#xff0c;需要進行Subversion配置&#xff1a; Repository URL&#xff1a;源碼地址&#xff0c;比如https:…

一鍵優雅為Ubuntu20.04服務器掛載新磁盤

itopen組織1、提供OpenHarmony優雅實用的小工具2、手把手適配riscv qemu linux的三方庫移植3、未來計劃riscv qemu ohos的三方庫移植 小程序開發4、一切擁抱開源&#xff0c;擁抱國產化 一、小于2T磁盤掛載方式 1.1 安裝磁盤到電腦后啟動系統 1.2 查找未分區的磁盤 打…

ios swift5 藍牙廣播出數據

WARNING: The advertisement key ‘Manufacturer Data’ is not allowed WARNING: The advertisement key ‘Service Data’ is not allowed manager?.startAdvertising([CBAdvertisementDataServiceUUIDsKey : [myService?.uuid], CBAdvertisementDataLocalNameKey : "…

鴻蒙Navigation的頁面跳轉官方代碼

星河版本 文章部分代碼來源于官方 文章部分代碼來源于官方只是自己改了容易理解 與API4不同的Navigation 新版本使用的思路是 1、創建頁面棧 pageInfos: NavPathStack new NavPathStack();2、resources/base/profile創建 router_map.json 文件 {"routerMap":…

數電設計提問求幫助,出租車計費器。

&#x1f3c6;本文收錄于《CSDN問答解惑-》專欄&#xff0c;主要記錄項目實戰過程中的Bug之前因后果及提供真實有效的解決方案&#xff0c;希望能夠助你一臂之力&#xff0c;幫你早日登頂實現財富自由&#x1f680;&#xff1b;同時&#xff0c;歡迎大家關注&&收藏&…

Autosar診斷實戰系列28-2E寫DID Pending期間偶發回NRC0x13問題排查

本文框架 前言1.問題描述2.問題復現3.問題分析問題1:為何在2E Pending期間會發送功能尋址的10 01回NRC13?問題2:在ECU Pending期間收到功能尋址10 01,MCU需要如何處理?問題3:DcmDslConnection是如何定義的?問題4:功能尋址于物理尋址是否對應不同的DcmDslConnection?問…

Pandas數據可視化寶典:解鎖圖形繪制與樣式自定義的奧秘

Pandas數據可視化寶典&#xff1a;解鎖圖形繪制與樣式自定義的奧秘 引言 數據可視化是將數據以圖形或圖像的形式展示出來&#xff0c;使復雜的數據更容易被人類理解和分析。在數據分析、商業智能、科學研究等領域&#xff0c;數據可視化都扮演著至關重要的角色。Pandas作為一…