Python中的魔力編程:掌握面向對象之道

Python中的面向對象編程

背景:

? 最近在看一些代碼的時候,對類中的一些內置方法不是很懂,因此出一篇文章來細說一下,希望大家看完后對Python中類有一個清楚的認識。

基礎鋪墊:

? 面向對象的三個特點:封裝、繼承、多態。面向對象的好處無非就是增加代碼的復用性,利于維護和修改,這也是高內聚,低耦合的體現。

  1. 封裝
    • 封裝是一種將數據(屬性)和操作數據的方法(方法)封裝在一個單元內的機制。
    • 類的成員變量可以設置為私有,只能通過類的方法來訪問和修改。
  2. 繼承
    • 繼承允許你創建一個新類,該類繼承了一個現有類的屬性和方法。新類稱為子類,原始類稱為父類或基類。
    • 子類可以擴展或修改繼承的屬性和方法,也可以添加新的屬性和方法。
  3. 多態
    • 多態性允許不同類的對象對相同的方法名做出不同的響應。這是通過方法的重寫和接口的實現來實現的。
類的特性:

Python使用class關鍵字來定義類,其基本結構如下:

  • class 類名(): #一般類名首字母是大寫pass
    
內置方法合集(重點):

? 內置方法(也稱為魔術方法或雙下劃線方法),它們具有特殊的含義和用途,為什么你有的時候看不懂一些方法,因為他是固定的,比較便捷,我們只需要對其重寫即可。

  1. __init__(self, ...): 這是一個類的構造方法,用于初始化對象的屬性。當你創建一個類的新實例時,__init__ 方法會自動調用,進行相關的賦值操作。
  2. __str__(self): 用于返回一個可讀的對象字符串表示。當你使用 print 函數打印一個對象時,它會自動調用 __str__ 方法來獲取字符串表示,我們一般對其重寫。
  3. __repr__(self): 用于返回一個對象的官方字符串表示。通常,它應該返回一個字符串,以用于創建相同對象的副本。
  4. __len__(self): 這用于返回對象的長度。你可以通過內置函數 len() 來獲取對象的長度,它會自動調用 __len__ 方法。
  5. __getitem__(self, key): 這用于允許對象像字典或列表一樣通過索引或鍵來訪問其元素。它用于實現對象的索引訪問。
  6. __setitem__(self, key, value): 用于允許對象像字典或列表一樣通過索引或鍵來設置其元素的值。它用于實現對象的索引賦值。
  7. __delitem__(self, key): 用于允許對象像字典或列表一樣通過索引或鍵來刪除其元素。它用于實現對象的索引刪除。
class Book:# self 是調用者def __init__(self, title, author, pages): # Book類內置屬性 標題 作者 頁數self.title = titleself.author = authorself.pages = pagesdef __str__(self):return f"{self.title} by {self.author}"def __repr__(self):return f"Book({self.title}, {self.author}, {self.pages})"def __len__(self):return self.pagesdef __getitem__(self, page_number):if page_number >= 1 and page_number <= self.pages:return f"Page {page_number} of {self.title}"else:raise IndexError("Page number out of range")def __iter__(self):self.current_page = 1 # 封裝一個屬性return selfdef __next__(self):if self.current_page <= self.pages:result = f"Page {self.current_page} of {self.title}"self.current_page += 1return resultelse:raise StopIteration
# 創建一個Book對象
book = Book("Python Basics", "John Smith", 100) #會自動調用 __init__ 方法# 使用內置方法
#  打印對象 會自動調用__str__
print(book) # 輸出: Python Basics by John Smith 
# 調用__len__ 函數
print(len(book)) #輸出 100
# 調用__repr__ 函數
print(repr(book))  # 輸出: Book(Python Basics, John Smith, 100)
# __getitem__ 當取某一個元素得時候會自動調用
print(book[1])  # 輸出: Page 1 of Python Basics
print(book[50])  # 輸出: Page 50 of Python Basics
# # 迭代書的頁面
for page in book:print(page)#  第一次調用會執行__iter__函數,然后不斷使用__next__ 函數,for page in book:會反復調用 __next__ 方法,每次迭代都會獲取下一頁的頁面信息,直到沒有更多的頁面可供迭代為止。

在這里插入圖片描述

組合:

? 組合指的是,在一個類中以另外一個類的對象作為數據屬性,稱為類的組合

class Student():def __init__(self):# 將創建好的手機對象賦值給了phone這個實例變量self.phone = Phone('霸王別姬')class Phone():def __init__(self, movie_name):self.movie_name = movie_namedef playMovie(self):print('手機正在播放的電影是:', self.movie_name)s1 = Student()
s1.phone.playMovie()

在這里插入圖片描述

繼承:

? 通過繼承,你可以創建一個新類(子類),它可以繼承另一個類(父類或基類)的屬性和方法。子類可以擴展或修改父類的功能,并可以添加自己的屬性和方法。

  1. 父類和子類
    • 父類是被繼承的類,也被稱為基類或超類。
    • 子類是繼承父類的類,也被稱為派生類。
  2. 繼承語法
    • 在子類的類定義中,將父類作為子類的參數傳遞給類定義。
    • 使用 super() 函數可以在子類中調用父類的方法。
class ParentClass:def __init__(self, name):self.name = namedef speak(self):print(f"{self.name} is speaking.")class ChildClass(ParentClass):def __init__(self, name, age):super().__init__(name)  # 調用父類的構造方法self.age = agedef speak(self):super().speak()  # 調用父類的方法print(f"{self.name} is {self.age} years old and speaking.")child = ChildClass("Alice", 10)
child.speak()

在這里插入圖片描述

class ParentClass:def __init__(self, name):self.name = nameclass ChildClass(ParentClass):def __init__(self, name, age):# 不顯式調用父類的構造方法,Python會自動調用self.age = agechild = ChildClass("Alice", 10)
print(child.name)  # 輸出: Alice
print(child.age)   # 輸出: 10

? 子類 ChildClass 的構造方法沒有顯式調用 super().__init__(name),但仍然可以正確地初始化 name 屬性,因為Python會自動調用父類 ParentClass 的構造方法。但是,如果你在子類的構造方法中想做一些其他特定于子類的初始化工作,你可以顯式調用 super().__init__(name) 來確保父類的構造方法也被執行。

多態:
class Animal:def speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"def make_animal_speak(animal):return animal.speak()dog = Dog()
cat = Cat()print(make_animal_speak(dog))  # 輸出: "Woof!" 調用誰得對象,執行who得函數
print(make_animal_speak(cat))  # 輸出: "Meow!"
實例變量和類變量:
實例變量:
  • 實例變量指的是實例化對象本身擁有的變量。
  • 通過實例名加圓點的方式調用實例變量 對象.屬性
class Student():def __init__(self,i_name,i_age):#只要定義在init方法內部的變量就是【實例/對象變量】self.name = i_name #self.name就是定義的實例變量,name是init方法的參數值self.age = i_age #self.age就是定義的實例變量,age就是init方法的參數值s1 = Student('xxx',21) #調用Student類中的init這個構造方法
s2 = Student('lisi',225)
print(s1.name,s1.age) #訪問s1對象的name和age這兩個實例變量
print(s2.name,s2.age) #訪問s2對象的name和age這兩個實例變量
類變量:

? 顧名思義,類和實例化對象公用得屬性叫做類變量。定義在類中,方法之外的變量,稱作類變量。類變量是所有實例公有的變量,每一個實例都可以訪問類變量。

class Student():# 定義在方法外部的變量:類變量address = 'Beijing'classroom = 167def __init__(self, i_name, i_age):# 只要定義在init方法內部的變量就是【實例/對象變量】self.name = i_nameself.age = i_ages1 = Student('zhangsan', 20)  # 調用Student類中的init這個構造方法
s2 = Student('lisi', 25)
# 根據對象的引用訪問對象的實例變量
print(s1.name, s1.age)  # 訪問s1對象的name和age這兩個實例變量
print(s2.name, s2.age)  # 訪問s2對象的name和age這兩個實例變量
print(s1.address, s1.classroom) # 對象訪問類變量
print(Student.address,Student.classroom) # 類訪問類變量

一句話:類變量是可以被所有的對象公用的

類的方法:

? Python的類中可以包含三種不同類型的方法:實例方法、靜態方法和類方法。它們之間的區別主要涉及參數和調用方式,

實例方法
  • 實例方法是最常見的方法類型,在類內部定義時,第一個參數通常是 self,它表示對象自身。
  • 實例方法可以訪問和修改對象的屬性,因為它們有對當前實例的引用。
class Student():classroot = 167 #類變量#構造方法def __init__(self,name,age):#實例變量self.name = nameself.age = age#注意:實例方法只可以通過對象調用。def study(self,book):print('正在學習的書籍是:',book)s = Student('zhangsan',20) #實例化對象
#只給除了self其他的參數傳值
s.study('C++程序設計')
靜態方法
  • 靜態方法在類內部定義時,使用 @staticmethod 裝飾器來標識,它們不需要訪問對象的狀態,因此沒有 self 參數。
  • 靜態方法通常用于類級別的操作,而不是實例級別的操作。
class Obj():def __init__(self):pass# 定義一個靜態方法@staticmethoddef staticFunc(name):  # 靜態方法不需要有任何的必要參數(self)print('我是靜態方法!,我有一個普通參數:', name)Obj.staticFunc('帥哥')  # 通過類名調用(推薦)
o = Obj()
o.staticFunc('小帥哥')  # 通過對象名調用(不推薦)
類方法
  • 類方法在類內部定義時,使用 @classmethod 裝飾器來標識,它們的第一個參數通常是 cls,它表示類本身。
  • 類方法可以訪問和修改類級別的屬性,通常用于創建、操作或修改類級別的狀態。
class Obj():f = 'classVar'  # 類變量def __init__(self):pass@classmethoddef classFunc(cls):  # 類方法必須要有一個cls的參數,且作為第一個參數# cls也不是python的關鍵字,cls也可以寫作其他的形式,比如:xx,selfprint('我是類方法!必要參數cls的值為:', cls)print('類變量的值為:', cls.f)  # 類名訪問類變量o = Obj()
o.classFunc()  # 通過對象名訪問(不推薦)Obj.classFunc()  # 通過類名訪問(推薦)

在這里插入圖片描述

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

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

相關文章

C語言中的成員訪問:普通變量與指針變量的區別與使用

C語言中的成員訪問 在C語言中&#xff0c;我們可以通過變量來訪問它們的成員。根據變量的類型&#xff0c;我們使用不同的成員訪問符&#xff1a;.和->。本文將詳細介紹這兩個成員訪問符的使用。 目錄 普通變量的成員訪問指針變量的成員訪問示例代碼總結 普通變量的成員…

深入探索 Spring Boot:簡化開發,加速部署的全方位利器

目錄 導言 1. 自動配置&#xff08;Auto-Configuration&#xff09; 2. 起步依賴&#xff08;Starter Dependencies&#xff09; 3. 嵌入式 Web 服務器 4. Actuator 5. 外部化配置 6. 簡化的安全性配置 7. Spring Boot CLI 8. Spring Boot DevTools 導言 在當今軟件開…

java基礎之抽象的概念(全網最詳細)

一.抽象的概念 如下圖所示&#xff1a; 如上圖所示&#xff0c;一個父類為圖形&#xff0c;計算圖形的面積方法&#xff0c;那么就會有疑問&#xff0c;計算哪個圖形的面積呢&#xff1f;所以這個計算圖形的面積方法就稱為抽象方法&#xff1b; 二.抽象方法和抽象類的格式 …

3、Kafka 線上集群部署方案怎么做?

文章目錄 1、操作系統的選擇1.1、I/O 模型的使用1.2、數據網絡傳輸效率1.3、社區支持度 2、磁盤的選擇3、磁盤容量的規劃3.1、舉例思考本問題&#xff1a;3.2、計算一下&#xff1a;3.3、規劃磁盤容量時你需要考慮下面這幾個元素&#xff1a; 4、帶寬規劃4.1、計算 總結 1、操作…

電商淘寶爬蟲API與淘寶官方開放平臺API的區別以及如何選擇適合自己的API接口

隨著數字化時代的到來&#xff0c;數據已經成為企業競爭力的重要因素。為了獲取數據&#xff0c;企業或個人常常需要使用API接口。常見的API接口包括爬蟲API和官方開放平臺API。本文將詳細介紹這兩種API接口的區別以及如何選擇適合自己的API接口。 一、爬蟲API與官方開放平臺A…

如何使用GaussDB創建外表(FOREIGN TABLE)

目錄 一、前言 二、創建外表的特點 二、GaussDB創建外表訪問外部數據庫表&#xff08;示例&#xff09; 1、創建外表 2、FAQ&#xff1a;CREATE USER MAPPING錯誤 三、GaussDB創建外表映射數據文件&#xff08;示例&#xff09; 1、創建數據文件 2、創建外表 3、FAQ&a…

Java之時間類2(JDK8新增)

一、Date類 &#xff08;一&#xff09;、ZoneId&#xff1a;時區 1、概述 ZoneId是Java 8中處理時區的類。它用于表示時區標識符&#xff0c;例如“America/New_York”或“Asia/Tokyo”。一共有600個時區。 2、常用方法: static Set<String> getAvailableZoneIds()獲…

C++基礎知識

目錄 前言&#xff1a; 命名空間 命名空間的定義 命名空間的使用 c輸入與輸出 缺省參數 函數重載 引用 引用的特性 常引用 引用的使用場景 引用做參數 引用做返回值 引用與指針的區別 內聯函數 內聯函數的特性 前言&#xff1a; C 語言是結構化和模塊化的語言&…

VS CODE 出錯 XHR failed

重新下載過去的版本&#xff0c;可能由于最近版本更新導致 Visual Studio Code September 2023

談談MYSQL主從復制原理

目錄 概述 要點binlog日志 主從復制過程 總結 概述 MySQL 主從復制是指數據可以從一個MySQL數據庫服務器主節點復制到一個或多個從節點。 MySQL 默認采用異步復制方式。從節點不用一直訪問主服務器來更新自己的數據&#xff0c;數據的更新可以在遠程連接上進行&#xff0…

Volatility3內存取證工具安裝及入門在Linux下的安裝教程

1-1. Volatility3簡介 Volatility 是一個完全開源的工具&#xff0c;用于從內存 (RAM) 樣本中提取數字工件。支持Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android等多類型操作系統系統的內存取證。 針對競賽這塊&#xff08;CTF、技能大賽等&#xff09;基本上都…

websocket vue操作

let websocket: WebSocket; /** websocket測試 */ function connectWebsocket() {if (typeof WebSocket "undefined") {console.log("您的瀏覽器不支持WebSocket");return;}// let ip window.location.hostname ":8080";let ip "10.192…

瑞薩RZ/G2L核心板Linux Log目錄文件詳解

為了排除系統問題&#xff0c;監控系統健康狀況以及了解系統與應用程序的交互方式&#xff0c;我們需要了解各log文件的作用&#xff0c;以G2L中yocto文件系統為例&#xff0c;在系統/var/log/目錄下會存放記錄系統中各個部分的log文件作用如下&#xff1a; 1. 文件詳情 下圖…

Ubuntu系統部署Inis博客并使用內網穿透發布到公網隨時隨地遠程訪問

目錄 前言 推薦 1. Inis博客網站搭建 1.1. Inis博客網站下載和安裝 1.2 Inis博客網站測試 1.3 cpolar的安裝和注冊 2. 本地網頁發布 2.1 Cpolar臨時數據隧道 2.2 Cpolar穩定隧道&#xff08;云端設置&#xff09; 2.3.Cpolar穩定隧道&#xff08;本地設置&#xff09;…

鴻蒙原生應用/元服務開發-Stage模型能力接口(二)

ohos.app.ability.AbilityConstant (AbilityConstant)一、說明 AbilityConstant提供Ability相關的枚舉&#xff0c;包括設置初次啟動原因、上次退出原因、遷移結果、窗口類型等。本模塊首批接口從API version 9開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口…

matlab 最小二乘擬合平面(拉格朗日乘子法)

目錄 一、算法原理二、代碼實現三、結果展示本文由CSDN點云俠原創,原文鏈接。博客長期更新,爬蟲自重。 一、算法原理 設擬合出的平面方程為: a x + b y &#

Linux筆記之systemctl命令詳解

Linux筆記之systemctl命令詳解 code review! 文章目錄 Linux筆記之systemctl命令詳解systemctl restart docker 詳解 systemctl 是一個用于管理 systemd 服務的命令行工具。systemd 是一個用于啟動、停止和管理 Linux 系統中的進程的系統和服務管理器。下面是一些常見的 syst…

機器視覺系統選型-條形光源分類及應用場景

標準面光源 從平坦發光面照射漫射光 機械零件尺寸測量電子元件、IC的外形檢測邊緣缺陷檢測服裝紡織、食品包裝檢測 中孔面光源 從相機的同軸方向照射漫射光 金屬零件缺陷檢測金屬外殼檢測大面積電子元件的字符識別 平行面光源 照射平行度較高的漫射光玻璃瓶直徑測量螺釘牙輪…

Android studio 離線配置gradle

Gradle Distributions Gradle Distributions 查看gradle 文件夾下 gradle-wrapper.properties文件中的distributionUrl 版本號 然后在上邊網站下載對應需要的gradle對應版本 下載后復制到 gradle wrapper文件下&#xff0c;同時修改 distributionUrl 指向本地文件 然后同步就…

xtu oj 1233 Cycle Matrix

題目描述 給定N&#xff0c;輸出一個N*N的矩陣&#xff0c;矩陣為N層&#xff0c;每層是一個字符&#xff0c;從A到Z。 比如說N3,矩陣為 CCCCC CBBBC CBABC CBBBC CCCCC輸入 第一行是一個整數K&#xff08;K≤50&#xff09;,表示樣例數。 每個樣例占1行&#xff0c;為一個整…