知識速查大全:python面向對象基礎

目錄

一、面向對象的基本概念

二、類和對象

1.類

2.對象

三、屬性(數據)和方法

1.數據

1.1.實例數據

1.2.類數據

2.方法

2.1.實例方法

2.2.類方法

3.數據和方法的綜合使用

四、面向對象三大特性

1.封裝

2.繼承

2.1.單繼承

2.2.多繼承

2.3.混合類

2.4.方法解析順序(MRO)

3.多態

五、數據訪問級別

1.公有

2.私有

3.保護

六、類的成員

特點

七、魔法函數

1.__init__

2.__str__

3.數學比較

4.__len__

5.__new__(cls)、__del__

6.上下文管理器

總結


一、面向對象的基本概念

面向對象編程(Object-Oriented Programming,OOP)是一種編程范式,它以"對象"為核心組織代碼和數據,他更適合一些復雜項目的開發,通過封裝方法和屬性,讓代碼的復用性增強,提高了開發效率。

二、類和對象

類是抽象的,對象是具體的。

1.類

類是創建對象的藍圖或模板,它定義了對象的屬性和行為。下面是定義一個類:

class MyClass:"""一個簡單的類示例"""pass

2.對象

對象是類的實例,是根據類創建的具體實體。以下是對上述類的一個實例化對象:

obj = MyClass()

三、屬性(數據)和方法

1.數據

所謂數據,就是事物所具有的一定的特征。

1.1.實例數據

實例數據屬于特定實例的變量,通過self在方法中定義和訪問。例如,下面定義了一個學生Student類,在類里面定義了兩個屬性,分別是self.name和self.age,這個就是實例數據。

class Student:def __init__(self, name, age):self.name = name  # 實例屬性self.age = age    # 實例屬性stu1 = Student("張三", 20)
stu2 = Student("李四", 22)
print(stu1.name)  # 輸出: 張三
print(stu2.name)  # 輸出: 李四

1.2.類數據

類數據屬于類本身的變量,所有實例共享同一個類屬性,定義在類內部但在方法外部。我們在學生類里面定義了類數據school,在類外部實例化兩個對象,運行結果是都能打印出這個屬性值。

class Student:school = "清華大學"  # 類屬性def __init__(self, name):self.name = namestu1 = Student("王五")
stu2 = Student("趙六")
print(stu1.school)  # 輸出: 清華大學
print(stu2.school)  # 輸出: 清華大學

2.方法

所謂方法,就是事物所具有的一定的行為。

2.1.實例方法

實例方法的第一個參數必須是self,表示當前實例,可以訪問和修改實例屬性。下面的bark就是我們的實例方法,self表示當前的實例。

class Dog:def __init__(self, name):self.name = namedef bark(self):  # 實例方法print(f"{self.name}在汪汪叫!")dog = Dog("阿黃")
dog.bark()  # 輸出: 阿黃在汪汪叫!

2.2.類方法

類方法使用@classmethod裝飾器,第一個參數是cls,表示當前類,可以訪問和修改類屬性。get_count(cls)這個方法第一個參數是cls,說明當前是類這個級別,在類外面以對象的形式調用。

class Student:count = 0  # 類屬性@classmethoddef get_count(cls):return cls.countdef __init__(self):Student.count += 1stu1 = Student()
stu2 = Student()
print(Student.get_count())  # 輸出: 2

3.數據和方法的綜合使用

問題:創建一個圓Circle類,為該類提供一個初始化方法,用于初始化半徑;為該類提供兩個方法,方法一用 于求圓的面積,方法二用于求圓的周長。

class Circle:PI = 3.14# 初始化方法def __init__(self, radius):self.radius = radiusdef get_area(self):return Circle.PI * self.radius ** 2def get_perimeter(self):return 2 * Circle.PI * self.radiusc = Circle(1)
print(c.get_area())
print(c.get_perimeter())

四、面向對象三大特性

1.封裝

將數據和操作數據的方法綁定在一起即為封裝。封裝在類中非常常見,封裝完成后,進行類的實例化即可。

class Product:def __init__(self, name, price):self.name = nameself.price = pricedef get_price(self):return self.priceclass Food:def __init__(self, weight):self.weight = weightdef get_qian(self):print(Product("食物", 49.9).price)
f = Food(20)
f.get_qian() # 輸出49.9

2.繼承

2.1.單繼承

一個子類只繼承一個父類,這樣的繼承叫做單繼承。

# 繼承
class Animal:def __init__(self, age):self.age = agedef __str__(self):return "hello"def shark(self):print("動物都會叫")a = Animal(5)
print(a, a.age)
a.shark()class Dog(Animal):def __init__(self, age, name):super().__init__(age)self.name = namedef __str__(self):return "這是一只狗狗"def shark(self):print("狗正在叫喊")d = Dog(7, "lida")
print(d, d.age, d.name)
d.shark()class AQ(Dog):def __init__(self, age, name, height):super().__init__(age, name)self.height = heightdef __str__(self):return "這是一只Dog隊"def shark(self):print("團隊活動正在精心準備進行")aq = AQ(9, "huange", 2.5)
print(aq, aq.age, aq.name, aq.height)
aq.shark()

2.2.多繼承

多繼承的一個子類可以繼承多個父類。

class Father:def __init__(self, money):self.money = moneydef get_money(self):print(self.money)class Mother:def __init__(self, beautiful):self.beautiful = beautifuldef get_beautiful(self):print(self.beautiful)class Son(Father, Mother):def __init__(self, money, beautiful):#     # 多繼承中,子類只能繼承(識別)第一個父類#     # super().__init__(money)#     # super().__init__(beautiful)#     # 多繼承使用類調用,要有selfFather.__init__(self, money)Mother.__init__(self, beautiful)def show(self):return f"共計{self.money}"s = Son("100", "漂亮")
s.get_money()
s.get_beautiful()

當處于多繼承時,子類使用超類調用,只能繼承(識別第一個父類),因此,我們一般會通過“父類對象.__init__()”類調用的方法進行完整的繼承。

2.3.混合類

一種特殊的多繼承用法,用于添加功能,通常是以Mixin結尾。

class Life:def __init__(self, hb):self.hb = hbdef __str__(self):return f"生命值{self.hb}"class Animal:passclass SwimmingAbleMixin:def swim(self):print(f"魚可以游泳")class Fish(Life, SwimmingAbleMixin):passf = Fish("100")
print(f) # 生命值100
f.swim() # 魚可以游泳

2.4.方法解析順序(MRO)

Python使用C3算法確定多繼承時的查找順序。

class A:passdef __str__(self):return "A"class B11:pass# def __str__(self):#     return "B11"class B12:def __str__(self):return "B12"class B1(B11, B12):pass# def __str__(self):#     return "B1"class B2:pass# def __str__(self):#     return "B2"class B(B1, B2):pass# def __str__(self):#     return "B"class C(B, A):pass# def __str__(self):#     return "C"c = C()
print(c)

3.多態

多態就是不同類的對象對同一消息做出不同的響應。一般都是編譯型語言擁有的概念。

class Employee:def __init__(self, name, salary):self.name = nameself.salary = salarydef get_salary(self):raise NotImplemented("子類必須重寫父類")class Manage(Employee):def __init__(self, bonus, name, salary):super().__init__(name, salary)self.bonus = bonusdef get_salary(self):total = self.salary + self.bonusreturn f"{self.name}的總工資為{total}"m = Manage(500, "劉強", 8000)
print(m.get_salary()) # 輸出:劉強的總工資為8500

上述代碼創建另一個基類和一個子類,兩個類都有同一種方法get_salary(),但是需要通過子類重寫父類實現。

  • 父類中的raise NotImplemented("子類必須重寫父類")表示子類中必須要實現此方法,否則程序會出錯。
  • 子類中super().__init__(name, salary)表明繼承父類中的兩個屬性(數據)。

五、數據訪問級別

1.公有

默認格式,類內通過self訪問,類外通過對象訪問。

class MyClass:def __init__(self):self.public_var = "I'm public"def public_method(self):return "Public method"obj = MyClass()
print(obj.public_var)      # 可以直接訪問
print(obj.public_method()) # 可以直接調用

2.私有

__開頭,類內以self訪問,類外不可訪問。

class MyClass:def __init__(self):self.__private_var = "I'm private"def __private_method(self):return "Private method"obj = MyClass()
# print(obj.__private_var)      # 直接訪問會報錯
# print(obj.__private_method()) # 直接調用會報錯# 通過名稱修飾后的名稱仍可訪問(但不應該這樣做)
print(obj._MyClass__private_var)      # 可以訪問
print(obj._MyClass__private_method()) # 可以調用

3.保護

_開頭,本類內可以訪問,本類外也可以訪問,但不推薦;通常是在子類中使用。

class MyClass:def __init__(self):self._protected_var = "I'm protected"def _protected_method(self):return "Protected method"obj = MyClass()
print(obj._protected_var)      # 仍然可以訪問,但不建議
print(obj._protected_method()) # 仍然可以調用,但不建議

六、類的成員

除了上述介紹的類的成員,下面還有一種類成員,就是靜態方法。靜態方法(Static Method)是一種屬于類但不屬于類的任何特定實例的方法。這意味著你可以調用靜態方法而不創建類的實例。靜態方法通常用于實現那些不依賴于類實例狀態的工具方法或輔助方法。

class MyClass:@staticmethoddef static_method():print("Called static_method")@staticmethoddef sum(a, b):print(a + b)@staticmethoddef max(a, b):return a if a > b else bMyClass.static_method()
MyClass.sum(3, 5)
print(MyClass.max(12, 5))

上述代碼中,我們在調用靜態方法時,并沒有進行實例化,而是通過函數名直接調用。

特點

  • 無需實例:你可以直接通過類名調用靜態方法,無需創建類的實例。

  • 不接受?self?或?cls:靜態方法不會自動接收任何類或實例作為第一個參數。

  • 用途:靜態方法通常用于實現那些不需要訪問類實例狀態的函數,例如工廠方法、工具函數等。

七、魔法函數

1.__init__

__init__函數用于初始化self。

class Light:def __init__(self):"""初始化函數:用于初始化selfself就是類執行產生的對象"""self.color = "紅色"print(id(self))def set_light(self, color):self.color = colorprint(self.color)def get_light(self):print(self.color)創建對象l1
l1 = Light()
l1.set_light("綠色")
print(id(l1), l1.color)print("++++++++++++++")創建對象l2
l2 = Light()
l2.get_light()

2.__str__

__str__函數返回的結果必須是字符串,也是自動調用。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"Person(name='{self.name}', age={self.age})"p = Person("Alice", 30)
print(p)  # 輸出: Person(name='Alice', age=30)

3.數學比較

數學比較的魔法函數有__gt__、__ge__、__lt__、__le__、__eq__和__ne__。所有的魔法函數不需要主動調用,以__**__為格式。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):"""對象的字符串表示:return: 字符格式"""return  f"{self.name}:{self.age}"def __gt__(self, other):"""重寫,實例比較的>:param other::return:"""return self.age > other.agedef __ge__(self, other):return  self.age >= otherdef __lt__(self, other):"""小于:param other::return:"""return self.age < other.agedef __le__(self, other):return self.age <= other.agedef __ne__(self, other):return self.age != other.agedef __eq__(self, other):return self.age == other.agep1 = Person("abc", 20)
print(p1)
p2 = Person("jsp", 26)
print(p1 <= p2)

4.__len__

__len__用于定義對象的長度。當對對象調用內置的?len()?函數時,Python 會自動調用該對象的?__len__?方法。

class MyCollection:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)collection = MyCollection([1, 2, 3, 4, 5])
print(len(collection))  # 輸出: 5

5.__new__(cls)、__del__

構造函數:創建類的新實例對象;析構函數:用于對象銷毀的特殊方法

class Animal:# 必須返回一個類的實例,否則init__,方法不會被調用。def __new__(cls, *args, **kwargs):# cls 是當前類對象,必須作為參數傳入instance = super().__new__(cls)return instancedef __init__(self):print("初始化函數執行了", id(self))def __del__(self):print("正在銷毀...")
# 先調用 __new__ 創建對象,再調用 __init__ 初始化對象
a = Animal()
print(a, id(a))

6.上下文管理器

__enter__:實現資源的獲取;

__exit__:實現資源的釋放。

class Myopen:def __init__(self, filename, mode):self.filename = filenameself.mode = modeself.file = Nonedef __enter__(self):self.file = open(self.filename, self.mode)return self.filedef write(self, msg):self.file.write(msg)def __exit__(self, exc_type, exc_val, exc_tb):# exc_type:異常類型# exc_val:異常值# exc_tb:追蹤信息if self.file:self.file.close()with Myopen("myfile.txt", "w") as  f:f.write("Hello world!")

總結

面向對象編程(OOP)是一種以對象為核心的編程范式,其核心概念包括類與對象、屬性與方法、三大特性(封裝、繼承、多態)以及數據訪問控制等。類作為對象的抽象模板,通過定義屬性和方法來描述實體的特征和行為,其中屬性分為實例數據(對象獨有)和類數據(類共享),方法則包括實例方法(操作實例數據)、類方法(操作類數據)等。面向對象三大特性中,封裝通過訪問控制(公有、私有、保護)隱藏實現細節;繼承支持單繼承和多繼承,通過方法解析順序(MRO)解決多繼承沖突;多態則允許不同類對象對同一方法產生不同行為。類的特殊成員如魔法函數(如__init__構造對象、__str__定義字符串表示、__len__支持長度計算等)賦予類更靈活的行為能力。上下文管理器(__enter__/__exit__)等高級特性進一步擴展了對象的功能邊界。這些概念共同構成了面向對象編程的完整體系,通過抽象、模塊化和代碼復用提升軟件的可維護性和擴展性。

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

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

相關文章

Linux系統編程Day1-- 免費云服務器獲取以及登錄操作

一、 學生黨如何“白嫖”或免費使用云服務器&#xff1f; 作為學生黨&#xff0c;資金有限的情況下確實不容易長期負擔服務器費用。但好消息是&#xff0c;有多種方式可以“白嫖”或低成本使用云服務器&#xff0c;尤其是針對學生身份、學習用途和開發者計劃。 1、使用各大云平…

15.11 單卡訓練770M參數模型!DeepSpeed ZeRO-3實戰:RTX 4090顯存直降6.8GB

單卡訓練770M參數模型!DeepSpeed ZeRO-3實戰:RTX 4090顯存直降6.8GB 實戰 DeepSpeed ZeRO-2 和 ZeRO-3 單機單卡訓練 為什么需要單機單卡訓練場景? 雖然 DeepSpeed 的 ZeRO 技術主要面向分布式訓練場景,但單機單卡訓練仍然具有重要實踐價值: 開發調試:在資源有限情況下…

HTTPS基本工作過程:基本加密過程

HTTPS基本工作過程&#xff1a;HTTPS只是HTTP的基礎上引入加密機制1.引入對稱加密首先&#xff0c;什么是對稱加密和非對稱加密&#xff1f;對稱加密&#xff1a;使用同一把密鑰加密解密非對稱加密&#xff1a;有兩把密鑰&#xff0c;為公鑰&#xff08;公開的&#xff09;和私…

ES 文件瀏覽器:多功能文件管理與傳輸利器

ES 文件瀏覽器是一款功能強大的文件管理器軟件&#xff0c;支持多種文件傳輸協議&#xff0c;能夠方便地管理手機、平板電腦和電腦中的文件。它不僅提供了豐富的文件管理功能&#xff0c;還支持多種設備之間的文件傳輸&#xff0c;滿足用戶在不同場景下的需求。 核心功能 1. 文…

github-idea新建文件就要彈窗提醒-如何關閉-2025.7.30

打開設置 進入 File&#xff08;文件&#xff09; > Settings&#xff08;設置&#xff09;。 導航到版本控制設置&#xff1a; 在左側導航欄中&#xff0c;展開 Version Control&#xff08;版本控制&#xff09;。 選擇 Confirmation&#xff08;確認&#xff09;。修改文…

滾珠導軌在電子制造中的流暢性優勢

在電子元件微米級精度要求的搬運與裝配環節&#xff0c;傳統導軌易因摩擦、磨損導致定位偏差或設備抖動。而滾珠導軌憑借滾動摩擦設計&#xff0c;將滑動阻力降低80%以上&#xff0c;成為高精度電子制造設備的首選傳動部件。微米級精度&#xff1a;在貼片機中&#xff0c;滾珠導…

數據結構——單鏈表1

1. 單鏈表1.1 概念與結構概念&#xff1a;鏈表是一種物理存儲結構上非連續、非順序的存儲結構&#xff0c;數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。1.1.1 結點與順序表不同的是&#xff0c;鏈表里的每節都是獨立申請下來的空間&#xff0c;我們稱之為“節點/結點…

STM32CubeMX + HAL庫:基于DHT11溫濕度監測實現

1. 概述1.1 實驗目的本實驗旨在利用 DHT11 溫濕度傳感器&#xff0c;每隔 5 秒采集一次環境的溫度與濕度數據&#xff0c;并通過串口將數據循環打印輸出。所使用的 DHT11 模塊硬件結構簡單&#xff0c;包含三個接口引腳&#xff1a;電源正極&#xff08;VCC&#xff09;、電源負…

常見排序的特性總結

目錄 1.排序的穩定性 2.直接插入排序的特性總結 3.希爾排序的特性總結 4.直接選擇排序的特性總結 5.堆排序的特性總結 6.冒泡排序的特性總結 7.快速排序的特性總結 8.歸并排序的特性總結 9.計數排序的特性總結 10.總結 1.排序的穩定性 排序的穩定性是說 相同大小的元…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-49,(知識點:OSI模型,物理層、數據鏈路層、網絡層)

目錄 1、題目 2、解答 OSI 七層模型的分層及功能&#xff08;從下到上&#xff09; 1. 物理層&#xff08;Physical Layer&#xff09; &#xff1a;網卡的物理接口、網線、光纖、集線器 2. 數據鏈路層&#xff08;Data Link Layer&#xff09;&#xff1a;交換機&#xf…

R 環境安裝指南

R 環境安裝指南 引言 R 是一種針對統計計算和圖形表示的編程語言和軟件環境。它廣泛應用于數據分析和統計建模領域。本指南旨在為用戶提供一個清晰、詳細的 R 環境安裝步驟,確保用戶能夠順利地開始使用 R 進行數據分析。 安裝前的準備 在開始安裝 R 之前,請確保您的計算機…

Cesium entity跟隨第一人稱視角

1.跟隨視角let firstView:any; const firstPerspective (entity: any) > {firstView () > {let curTime window.viewer.clock.currentTime;const pos entity.position.getValue(curTime);const orientation entity.orientation.getValue(curTime);if (pos &&…

傳輸層協議UDP與TCP

目錄 一. UDP 1.1 UDP協議段格式 1.2 UDP傳輸的特點 1.3 面向數據報 1.4 UDP緩沖區 1.5 報文的理解 二. TCP 2.1 TCP協議段格式 2.2 確認應答機制&#xff08;ACK&#xff09; 2.3 超時重傳機制 2.4 連接管理機制 為什么要三次握手&#xff1f; 三次&#xff1f;四…

SringBoot入門

文章目錄SpringBoot入門一、關于&#xff1a;約定大于配置二、創建SpringBoot項目---起步案例創建SpringBoot項目案例創建項目方式2&#xff1a;通過aliyun網站創建創建項目方式3---基于官方地址創建三、配置項目項目結構自定義配置四、SpringBoot原理&#xff08;重點&#xf…

ansible 版本升級

1. 服務器上查看對應ansible 可安裝的版本 yum info ansible 對比官網,服務器對應ansible 版本比較地址,不利于了解新版本的屬性。 2. 升級比較新的ansible 版本,安裝epel-release wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm rpm -iv…

企業微信API接口發消息實戰:從0到1的技術突破之旅

摘要&#xff1a;本文詳細介紹了通過企業微信官方API接口實現消息發送功能的完整實戰流程。首先闡述了企業微信API在數字化辦公中的重要性&#xff0c;重點講解了消息發送接口的應用場景。實戰部分分為前期準備、開發環境搭建和具體實現三個環節&#xff0c;包括創建企業微信應…

Linux的小程序——進度條

為了寫出這個小程序我們先來了解幾個知識點(一)回車和換行先以寫作文為例子了解一下&#xff0c;當在一行中寫了一半&#xff0c;由此處位置往下一行的操作叫做換行&#xff0c;回到該行的開頭位置為回車。而在c語言中\n幫我們完成了換行和回車兩個動作&#xff0c;那單純回車是…

在macOS上使用VS Code和Clang配置C++開發環境

本文基于VS Code官方文檔&#xff0c;詳細介紹如何在macOS系統下配置Clang/LLVM編譯器與VS Code的C開發環境。通過本文&#xff0c;你將學會如何搭建開發環境、創建并調試C程序&#xff0c;適合C初學者和需要在macOS上進行C開發的開發者。 前提條件 在開始配置前&#xff0c;…

Ganttable 基于工時的進度分析

時間進度分析是 Ganttable 提供的高級進度管理功能&#xff0c;它基于實際工作時長&#xff0c;結合計劃預估工時&#xff0c;可精準計算項目及任務的完成度。開啟進度分析開啟進度分析功能的操作如下&#xff1a;在時間管理頁面&#xff0c;點擊右上角的 “設置” 按鈕&#x…

duiLib 自定義資源目錄

前面的demo&#xff0c;把布局文件放在默認目錄了&#xff0c;想著應該也可以自定義資源路徑。先debug看下默認目錄是什么路徑。設置調試選項&#xff0c;調試信息格式改為程序數據庫&#xff08;/Zi&#xff09;再調試項目&#xff0c;選中監視1&#xff1a;在監護窗口中查看變…