理解 Python 中的 `super()` 與 `__init__()` 方法

在 Python 的面向對象編程中,super() 函數和 __init__() 方法是兩個非常重要的概念。它們在類的繼承和初始化過程中扮演著關鍵的角色。本文將深入探討這兩個概念的工作原理,并通過示例代碼來展示它們的使用。

基本原理

__init__() 方法

__init__() 是一個特殊的方法,也稱為類的構造器。當你創建一個類的新實例時,Python 會自動調用這個方法。它通常用于初始化對象的狀態,即設置對象的屬性。

class Person:def __init__(self, name):self.name = name# 創建對象時,會自動調用 __init__() 方法
person = Person("Alice")
super() 函數

super() 是一個內置函數,它返回了當前類在繼承鏈中的上一個類(即父類或基類)。當你在派生類中重寫方法時,你可能想要調用父類中的相同方法,這時就可以使用 super() 來實現。

class Animal:def make_sound(self):print("Animal makes a sound")class Dog(Animal):def make_sound(self):super().make_sound()  # 調用 Animal 類的 make_sound 方法print("Dog barks")dog = Dog()
dog.make_sound()  # 輸出: Animal makes a sound# 接著輸出: Dog barks

示例代碼

示例 1: 使用 super() 調用父類方法
class Vehicle:def start(self):print("Vehicle has started")class Car(Vehicle):def start(self):print("Car engine is on")super().start()  # 調用 Vehicle 類的 start 方法car = Car()
car.start()
# 輸出:
# Car engine is on
# Vehicle has started

在這個例子中,Car 類繼承了 Vehicle 類。在 Car 類的 start() 方法中,我們首先打印一條消息,然后使用 super().start() 來調用父類 Vehiclestart() 方法。

示例 2: 多級繼承中的 super()
class Animal:def make_sound(self):print("Animal makes a sound")class Dog(Animal):def make_sound(self):super().make_sound()  # 調用 Animal 類的 make_sound 方法print("Dog barks")class SuperDog(Dog):def make_sound(self):super().make_sound()  # 調用 Dog 類的 make_sound 方法print("SuperDog howls")super_dog = SuperDog()
super_dog.make_sound()
# 輸出:
# Animal makes a sound
# Dog barks
# SuperDog howls

在這個例子中,我們有一個多級繼承的鏈條:SuperDog 繼承自 Dog,而 Dog 繼承自 Animal。在 SuperDogmake_sound() 方法中,super().make_sound() 首先調用 Dogmake_sound(),然后逐級向上調用。

示例 3: 使用 super() 初始化父類
class Person:def __init__(self, name):print("Person is initialized with name:", name)class Employee(Person):def __init__(self, name, job_title):super().__init__(name)  # 初始化 Person 類self.job_title = job_titleprint("Employee with job title:", job_title)employee = Employee("Alice", "Engineer")
# 輸出:
# Person is initialized with name: Alice
# Employee with job title: Engineer

在這個例子中,Employee 類繼承自 Person 類。在 Employee__init__() 方法中,我們使用 super().__init__(name) 來初始化父類 Person 的實例。

注意事項

  1. 正確使用 super(): super() 應該在你想要調用父類中的方法時使用。濫用 super() 可能會導致不必要的間接調用,降低代碼的可讀性。

  2. 理解 super() 的返回值: super() 返回的是父類的一個對象,你可以在其上調用任何父類的方法。

  3. 初始化順序: 當你在一個派生類的 __init__() 方法中使用 super() 時,它首先會初始化所有父類,然后才是派生類自己的初始化代碼。

  4. 避免無限遞歸: 如果在派生類的 __init__() 方法中忘記調用 super() 或者在父類的 __init__() 方法中也忘記調用其 super(),可能會導致無限遞歸。

  5. MRO(方法解析順序): Python 使用一種稱為方法解析順序的機制來決定如何搜索方法。了解 MRO 對于理解 super() 如何工作非常重要。

通過上述的示例和解釋,我們可以看到 super()__init__() 在 Python 類繼承和對象初始化中扮演著至關重要的角色。正確使用這兩個概念可以讓我們寫出更加清晰、易于維護的代碼。希望這篇文章能夠幫助初學者更好地理解這兩個概念,并在實際編程中加以應用。

【痕跡】QQ+微信朋友圈和聊天記錄分析工具1.0.4 (1)純Python語言實現,使用Flask后端,本地分析,不上傳個人數據。

(2)內含QQ、微信聊天記錄保存到本地的方法,真正實現自己數據自己管理。

(3)數據可視化分析QQ、微信聊天記錄,提取某一天的聊天記錄與大模型對話。

下載地址:https://www.lanzoub.com/b00rn0g47e 密碼:9hww

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

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

相關文章

Vue中的全局事件總線:EventBus與$bus的比較詳解與實戰應用

EventBus實例: var EventBus new Vue() 會創建一個名為EventBus的Vue實例,并將其存儲在變量EventBus中。Vue.prototype.$bus new Vue() 則直接在Vue的原型上創建一個新的Vue實例,并將其賦值給$bus屬性。 使用方式: var EventBus…

C# 結合 JavaScript 對 Web 控件進行數據輸入驗證

目錄 關于數據驗證 范例運行環境 驗證設計 JavaScript 方法 設計 實現 調用示例 C# 方法 設計 實現 調用示例 小結 關于數據驗證 在 Web 應用的錄入界面,數據驗證是一項重要的實現功能,數據驗證是指確認 Web 控件輸入或選擇的數據&#xff…

類對象作為類成員

在C中,類對象可以作為另一個類的成員變量。這種設計方式可以用于創建復雜的對象結構,使得一個類的對象能夠包含另一個類的對象。這種嵌套類的組合方式可以增強代碼的可重用性和模塊化。 類對象作為類成員的示例 讓我們通過一個示例來解釋這一概念。假設…

武漢信息系統建設和服務能力評估CS認證咨詢

很多企業在咨詢信息系統建設和服務能力評估的時候喜歡百度搜索,不管是本地咨詢機構還是外地咨詢機構只要價格便宜就找誰,這個在低等級的CS1是可以這么操作的,一旦上升到CS2級別及以上的,我們一般不推薦找外地咨詢機構,…

【文末附gpt升級方案】字節跳動發布豆包大模型:AI領域的革新與引領

隨著科技的飛速進步,人工智能(AI)已逐漸成為推動社會發展的重要力量。在這一背景下,字節跳動公司以其前瞻性的眼光和創新能力,于XXXX年XX月XX日正式發布了豆包大模型,這一舉動無疑在AI領域掀起了新一輪的浪…

C語言.動態內存管理

動態內存管理 1.為什么要有動態內存分配2.malloc和free2.1malloc2.2free 3.calloc和realloc3.1calloc3.2realloc 4.常見的動態內存管理的錯誤4.1對NULL指針解引用操作4.2對動態開辟空間的越界訪問4.3對非動態開辟內存使用free釋放4.4使用free釋放一塊動態開辟內存的一部分4.5對…

軍訓中的美差

大學時候的軍訓是在二年級秋季開學前進行的,地點是在河北的某部隊。 軍訓時候的分班是按照學號重新劃分的,我的學號在大學宿舍八個人中排最后,恰好就和其他宿舍的人分在了一個班。訓練正步走的時候,站在我左邊的那個哥們&#xf…

Signal 即將成為JavaScript的一部分

什么是響應性? 在過去的幾年中,響應性成為了所有現代前端框架以及React庫的核心。 對于不熟悉前端開發的人來說,起初這可能是一個令人困惑的概念,因為它改變了常規的、自上而下的、從調用者到被調用者的順序工作流。 在響應性范…

AR系列路由器配置VLAN間通信

AR路由器是華為公司推出的企業級路由器產品系列,具有高可靠性、高性能和易管理等特點。AR 系列路由器提供的功能包括路由轉發、安全接入、語音、視頻、無線等多種業務,支持各種接入方式和協議,并且可以方便地進行擴展和升級。 實驗拓撲圖&…

微信小程序介紹

一、微信小程序概述 微信小程序是一種不需要下載、安裝即可使用的應用,用戶只需掃一掃或搜一下即可打開。它實現了應用觸手可及的夢想,降低了應用的使用門檻。微信小程序自2017年1月上線以來,已經吸引了大量開發者加入,構建了一個…

【全開源】云界旅游微信小程序(源碼搭建/上線/運營/售后/維護更新)

開啟您的云端旅行新體驗 一、引言 在快節奏的現代生活中,旅行成為了人們放松身心、探索世界的重要方式。讓您的旅行更加便捷、高效,打造了云界旅游小程序,帶您領略云端旅行的無限魅力。 二、小程序功能概覽 云界旅游小程序集成了豐富的旅游…

【代碼隨想錄算法訓練營第37期 第九天 | LeetCode28. 實現 strStr()、459.重復的子字符串】

代碼隨想錄算法訓練營第37期 第九天 | LeetCode28. 實現 strStr()、459.重復的子字符串 一、28. 實現 strStr() 解題代碼C&#xff1a; class Solution { public:void getNext(int* next, const string& s) {int j 0;next[0] 0;for(int i 1; i < s.size(); i) {whi…

【Maven】Nexus私服簡介_下載安裝_登錄

1、簡介 1.1介紹 Nexus私服&#xff0c;也被稱為Maven倉庫管理器&#xff0c;是許多公司在自己的局域網內搭建的遠程倉庫服務器。提供了強大的倉庫管理功能和構件搜索功能&#xff0c;使得開發人員能夠更方便地管理和使用Maven項目中的依賴庫。 1.2作用 內網訪問&#xff1…

Python代碼:七、小數化整數

1、題目 日常生活中我們會遇到很多小數&#xff0c;但是有的人不喜歡小數&#xff0c;因此會用四舍五入的方式將其去掉。在Python中我們更加簡單&#xff0c;可以利用強制類型轉換將小數轉變成整數&#xff0c;請你試一試。 2、代碼 import sysn float(input()) print(int(…

微服務(Spring Clould)--Nacos的安裝、配置

簡介&#xff1a;&#xff08;取自官網&#xff09; Nacos /nɑ:k??s/ 是 Dynamic Naming and Configuration Service的首字母簡稱&#xff0c;一個更易于構建云原生應用的動態服務發現、配置管理和服務管理平臺。 Nacos 致力于幫助您發現、配置和管理微服務。Nacos 提供了…

<sa8650>QCX Usecase 使用詳解—什么是可剪枝節點屬性以及何時使用

<sa8650>QCX Usecase 使用詳解—什么是可剪枝節點屬性以及何時使用 用例剪枝可實現光流設計分段(節點和目標緩沖區),這些分段實現了共享的邏輯接口,而這些接口的實現可能會發生沖突,但不會重復流水線。例如,overridesettings.txt 中的 enableAutoNoIPE=FALSE。 在 /qc…

《表格革命:數據可視化的力量與創新》

在當今數字化的時代&#xff0c;表格已不再是簡單的羅列工具&#xff0c;而是一場正在悄然興起的革命&#xff01; 表格&#xff0c;這個看似平凡無奇的存在&#xff0c;卻在各個領域發揮著至關重要的作用。無論是商業數據分析中精準呈現銷售趨勢和市場動態&#xff0c;還是學…

React 第三十七章 Scheduler 最小堆算法

在 Scheduler 中&#xff0c;使用最小堆的數據結構在對任務進行排序。 // 兩個任務隊列 var taskQueue: Array<Task> []; var timerQueue: Array<Task> [];push(timerQueue, newTask); // 像數組中推入一個任務 pop(timerQueue); // 從數組中彈出一個任務 time…

【深入理解MySQL的索引數據結構】

文章目錄 &#x1f4d5;索引底層數據結構與算法&#x1f4d9;索引數據結構&#x1f4d8;二叉樹&#x1f4d8;紅黑樹&#x1f4d8;Hash&#x1f4d8;B-Tree&#x1f4d8;BTree &#x1f4d9;表在不同存儲引擎的存儲結構&#x1f4d8;MyISAM存儲引擎索引實現&#x1f4da;文件結構…

C語言如何創建?個動態鏈表?

一、問題 創建動態鏈表就是指在程序執?過程中&#xff0c;從?到有&#xff0c;按照需求開辟結點和輸?各結點數據&#xff0c;并建?起前后相連接的關系。那么&#xff0c;如何創建動態鏈表呢&#xff1f; 二、解答 以建??個有任意名學?數據的單向動態鏈表為例&#xff0…