python多繼承的3C算法

python多繼承的3C算法

有很多地方都說python多繼承的繼承順序,是按照深度遍歷的方式,其實python多繼承順序的算法,不是嚴格意義上的深度遍歷,而是基于深度遍歷基礎上優化出一種叫3C算法

python多繼承的深度遍歷

class C:def run(self):print("這個是C類的方法");pass;class A(C):# def run(self):#     print("這個是A類的方法");pass;class B:def run(self):print("這個是B類的方法");class MainC(A,B):pass;# def run(self):#     print("這個是子類的方法");m1 = MainC();
m1.run();
print(MainC.mro())

在這里插入圖片描述
這段代碼輸出的結果就是
這個是C類的方法
[<class ‘main.MainC’>, <class ‘main.A’>, <class ‘main.C’>, <class ‘main.B’>, <class ‘object’>]

每個類如果沒有繼承其他類的話就默認繼承object這個基類
這個是比較正常的多繼承,然后是深度遍歷的方式

重復繼承的問題

基于上面改造一下

class C:def run(self):print("這個是C類的方法");pass;class A(C):# def run(self):#     print("這個是A類的方法");pass;class B(C):def run(self):print("這個是B類的方法");class MainC(A,B):pass;# def run(self):#     print("這個是子類的方法");m1 = MainC();
m1.run();
print(MainC.mro())

在這里插入圖片描述

這個繼承順序就有意思了,main繼承A和B,A繼承C,B也繼承C,這就出現了重復繼承的問題,那這種情況python是如何決定繼承順序的呢
輸出結果:

這個是B類的方法
[<class '__main__.MainC'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]

這個結果就出乎意料了,因為按照深度遍歷的方式的話,也應該繼承C再繼承B,但是卻不是這樣的
這個是因為python對于重復繼承的處理,按照這個繼承方式的話繼承順序是這樣的
mianC先繼承A,然后到查看C的情況,發現C同時被A和B繼承了,然后就先不處理,接著繼承B,然后看C的時候發現,沒有其他的繼承了,就接著繼承C

更加復雜的繼承

class F:def run(self):print("這個是F類的方法");pass;class G:def run(self):print("這個是G類的方法");pass;class E(F,G):def run(self):print("這個是E類的方法");pass;class C(E):def run(self):print("這個是C類的方法");pass;
class D(E):def run(self):print("這個是D類的方法");class A(C):# def run(self):#     print("這個是A類的方法");pass;class B(D):def run(self):print("這個是B類的方法");class MainC(A,B):pass;# def run(self):#     print("這個是子類的方法");m1 = MainC();
m1.run();
print(MainC.mro())

在這里插入圖片描述
繼承順序:

[<class '__main__.MainC'>, <class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.G'>, <class 'object'>]

這個就是跟復雜的多繼承了,但是只要用到上面說的邏輯去推理就知道繼承順序了
mainc先繼承A,然后看C,沒有被重復繼承,就繼承C,再看E,E被重復繼承了,先不處理,再從上面開始看,看B,沒有被重復繼承,再看D也沒有被重復繼承,直接繼承,再看E,也沒有其他的再繼承了就可以直接繼承,然后再看F,沒有重復繼承,就繼承,再到G

這個就是實際上python多繼承順序的算法,如果單純說是深度遍歷,其實是不對的

注意

盡量不要用多繼承,盡量不要用多繼承,盡量不要用多繼承
用多繼承會讓你的程序變得復雜又難讀,產生的bug也難查

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

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

相關文章

MySQL高級-MVCC-原理分析(RR級別)

文章目錄 1、RR隔離級別下&#xff0c;僅在事務中第一次執行快照讀時生成ReadView&#xff0c;后續復用該ReadView2、總結 1、RR隔離級別下&#xff0c;僅在事務中第一次執行快照讀時生成ReadView&#xff0c;后續復用該ReadView 而RR 是可重復讀&#xff0c;在一個事務中&…

Django 配置靜態文件

1&#xff0c;DebugTrue 調試模式 Test/Test/settings.py DEBUG True...STATICFILES_DIRS [os.path.join(BASE_DIR, static),] STATIC_URL /static/ 1.1 創建靜態文件 Test/static/6/images/Sni1.png 1.2 添加視圖函數 Test/app6/views.py from django.shortcuts impor…

uniapp,uni-fab組件拖動屬性,替代方案

文章目錄 1. 背景2. 替代方案2.1 方案一2.2 方案二 參考 1. 背景 最近基于uniapp開發一款設備參數調試的APP軟件&#xff0c;其中有使用到懸浮按鈕&#xff0c;快速開發階段&#xff0c;為了能盡快上線&#xff0c;直接使用了uni-ui的擴展組件uni-fab&#xff0c;參考【1】&am…

C++ 設計模式之迭代器模式

C 設計模式之迭代器模式 簡介 1、迭代器模式&#xff08;Iterator&#xff09;是一種行為型設計模式&#xff0c;它允許我們順序訪問一個聚合對象中的各個元素&#xff0c;而又不暴露該對象的內部表示。迭代器模式提供了一種方法來遍歷容器&#xff08;容器對象&#xff0c;如…

Configure C/C++ debugging

Configure C/C debugging launch.json 文件用于在 Visual Studio Code 中配置調試器。 Visual Studio Code 會生成一個 launch.json (位于項目的 .vscode 文件夾下),其中幾乎包含了所有必需的信息。要開始調試,您需要填寫 program 字段,指定要調試的可執行文件的路徑。這必須…

如何通過流式渲染提升用戶體驗?

什么是流式渲染&#xff1f; 流式渲染的核心理念是將 HTML 文檔分割成小塊&#xff08;chunk&#xff09;&#xff0c;并逐步地發送給客戶端&#xff0c;而非等待整個頁面完整生成后再進行傳輸。這種方式能夠極大地提升用戶的初始加載體驗&#xff0c;特別是在網絡條件不佳或者…

【從零開始學架構 架構基礎】四 架構設計的復雜度來源:可擴展性復雜度來源

架構設計的復雜度來源其實就是架構設計要解決的問題&#xff0c;主要有如下幾個&#xff1a;高性能、高可用、可擴展、低成本、安全、規模。復雜度的關鍵&#xff0c;就是新舊技術之間不是完全的替代關系&#xff0c;有交叉&#xff0c;有各自的特點&#xff0c;所以才需要具體…

新書速覽|Linux C與C++一線開發實踐

《Linux C與C一線開發實踐》 本書內容 Linux C/C編程在Linux應用程序開發中占有重要的地位&#xff0c;掌握這項技術將在就業競爭中立于不敗之地。《Linux C與C一線開發實踐》內容針對初中級讀者&#xff0c;貼近軟件公司一線開發實踐。全書厚達620多頁&#xff0c;知識點豐富…

Java中String和StringBuilder的區別

當然可以&#xff0c;我們可以通過面試問答的形式來探討String和StringBuilder的區別。 面試官&#xff1a;請解釋一下Java中String和StringBuilder的區別。 面試回答&#xff1a; 1. 不可變性&#xff08;Immutability&#xff09; String&#xff1a;String對象是不可變的…

微信小程序添加點擊事件

在微信小程序中&#xff0c;給<view>組件添加點擊事件非常直接&#xff0c;你可以使用bindtap屬性來綁定一個事件處理函數。下面是添加點擊事件的基本步驟和示例代碼&#xff1a; 步驟&#xff1a; 在WXML文件中&#xff1a;給需要添加點擊事件的<view>標簽添加bi…

第六周周報

摘要 本周重點跟著網課學習了pytorch框架下張量的各種常用操作API&#xff0c;為后面跑模型做準備&#xff0c;因為看的視頻比較偏向原理&#xff0c;現在對張量有了一個新的認識。其次在時序的研究上&#xff0c;最近我在看圖神經網絡跟時序結合的方向&#xff0c;所以本周學…

Qt自定義類型

概述 在使用Qt創建用戶界面時&#xff0c;特別是那些具有特殊控件和特性的界面時&#xff0c;開發人員有時需要創建新的數據類型&#xff0c;以便與Qt現有的值類型集一起使用或代替它們。 QSize、QColor和QString等標準類型都可以存儲在QVariant對象中&#xff0c;作為基于qo…

51單片機第6步_stdlib.h庫函數

本章重點學習stdlib.h庫函數。 #include <REG51.h> //包含頭文件REG51.h,使能51內部寄存器; #include <stdlib.h> //float atof (char *s1); //參數s1字符串可包含正負號,小數點或E(e)來表示指數部分,如123.456或123e-2; //若首字符是非數據字符,或為正負號…

es6語法復習一

es6語法 1.var 變量提升 2.let 不存在變量提升&#xff0c;只能定義一次 3.const 先定義再使用&#xff0c;定義好來不能修改 4.解構賦值 [a,b,c][1,2,3],{a,b,c}{a:1,b:2,c:3} 5.模版字符串 let aaa; ${a} is ok 6.對象簡化寫法 const school{ name, change, improve(){ cons…

力扣2438.二的冪數組中查詢范圍內的乘積

力扣2438.二的冪數組中查詢范圍內的乘積 lowbit求所有2的冪 accumulate函數(begin,end,start,way)求和/積的方式求積并取模 const int N 1e9 7;class Solution {public:int lowbit(int x){return x & -x;}vector<int> productQueries(int n, vector<vector&l…

[NSSCTF]-Reverse:[SWPUCTF 2021 新生賽]easyapp(安卓逆向,異或)

無殼 把后綴名改為zip&#xff0c;找到apk 查看jadx 這里調用了MainActivity的lambda$onCreate$0$MainActivity&#xff0c;然后又調用了Encoder進行異或。 exp&#xff1a; result棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌 key987654321 flag for i in range(len(result)):flagchr(…

HarmonyOS開發:應用完整性校驗

簡介 為了確保應用的完整性和來源可靠&#xff0c;OpenHarmony需要對應用進行簽名和驗簽。 應用開發階段&#xff1a; 開發者完成開發并生成安裝包后&#xff0c;需要開發者對安裝包進行簽名&#xff0c;以證明安裝包發布到設備的過程中沒有被篡改。OpenHarmony的應用完整性校…

Foxit Reader與PDF交互性:探索高級功能

引言 PDF&#xff08;Portable Document Format&#xff09;文件格式以其跨平臺的一致性和豐富的多媒體支持而廣受歡迎。Foxit Reader作為一款功能全面的PDF閱讀器&#xff0c;不僅提供了基本的查看和導航功能&#xff0c;還支持PDF文件中的多種交互式元素。本文將深入探討Fox…

SQL Server中 MERGE 語句

在 SQL Server 中,MERGE 語句用于根據兩個表之間的條件來插入、更新或刪除記錄。它通常用于同步兩個表的數據,其中一個表是源表(包含要插入或更新的數據),另一個是目標表(數據要插入或更新的表)。 1、本文內容 語法參數備注觸發器的實現權限有關索引的最佳做法MERGE 的…

探索sklearn的貝葉斯奧秘:樸素貝葉斯分類器全解析

&#x1f680; 探索sklearn的貝葉斯奧秘&#xff1a;樸素貝葉斯分類器全解析 樸素貝葉斯分類器是一類基于貝葉斯定理的簡單概率分類器&#xff0c;它們在文本分類、垃圾郵件識別等領域表現出色。在Python的sklearn庫中&#xff0c;樸素貝葉斯分類器以其實現簡單和效率高效而受…