python MRO及c3演算法

来源:https://www.cnblogs.com/a2534786642/archive/2018/12/24/10170663.html
-Advertisement-
Play Games

1. 瞭解python2和python3類的區別 python2在2.3之前使用的是經典類, 2.3之後, 使用的是新式類 2. 經典類的MRO 樹形結構的深度優先遍歷 -> 樹形結構遍歷 從左到右,深度遞歸,一直到頭再返回 Foo -> H -> G -> D -> B -> A -> C -> ...


1. 瞭解python2和python3類的區別

    python2在2.3之前使用的是經典類, 2.3之後, 使用的是新式類

2. 經典類的MRO 樹形結構的深度優先遍歷 -> 樹形結構遍歷

class A:
    pass
class B(A):
    pass
class C(A):
    pass
class D(B, C):
    pass
class E:
    pass
class F(D, E):
    pass
class G(F, D):
    pass
class H:
    pass
class Foo(H, G):
    pass

  

  從左到右,深度遞歸,一直到頭再返回

    Foo -> H -> G -> D -> B -> A -> C -> E

 

3. 新式類的MRO C3演算法

 拿第一項的第一位和 後面每項的除了第一位比較. 如果沒有出現, 則該位元素算出如果出現了. 此時開始下一項的第一位繼續和後面每一項的除了第一位比較:

 

    用頭和身體比較

 方法:   1. 拆分

 

       2. 合併

class A:
    pass
class B(A):
    pass
class C(A):
    pass
class D(B, C):
    pass
class E(C, A):
    pass
class F(D, E):
    pass
class G(E):
    pass
class H(G, F):
    pass
L(H) = H + L(G) + L(F) + GF # ECA + DBECA  = HGFDBECAO
L(G) = G + L(E) + E # GECA
L(E) = E + L(C) + L(A) + CA # ECA
L(C) = C + L(A) + A # CA
L(A) = A
L(F) = F + L(D) + L(E) + DE # FDBECA
L(D) = D + L(B) + L(C) + BC # DBCA
L(B) = B + A + A # BA
與Python中使用H.__mro__運行的結果相同
(<class '__main__.H'>, <class '__main__.G'>, <class '__main__.F'>, <class '__main__.D'>, <

class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>,
<class 'object'>)
4. super() 找MRO順序的下一個
class Base1:
    def chi(self):
        super().chi() 
        print("Base1")

class Base2:
    def chi(self):
        super().chi()
        print("Base2")

class Base3:
    def chi(self):
        print("Base3")

class Bar(Base1, Base2, Base3):
    def chi(self):
        print("Bar里chi1")
        super(Bar, self).chi() 
        print("Bar里chi2")

b = Bar()

  結果 :Bar里chi1,Base3,Base2,Base1,Bar里chi2


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 本篇緊接著spring入門詳細教程(一),建議閱讀本篇前,先閱讀第一篇。鏈接如下: Spring入門詳細教程(一) https://www.cnblogs.com/jichi/p/10165538.html 一、spring註入方式 1、set方法註入 2、構造方法註入 3、p名稱空間註入 4 ...
  • JUnit常用單元測試註解介紹及代碼演示 by:授客 QQ:1033553122 1. 測試環境 1 2. 基礎概念 1 3. 常用Annotation 1 4. 運行環境配置 3 maven配置 3 Eclipse maven運行環境配置 4 更新項目 5 5. 單元測試實踐 7 被測類Binar ...
  • 1. 安裝 2. 項目目錄 3. settings配置 4. celery模塊 python 在task文件中 from __future__ import absolute_import, unicode_literals import os from celery import Celery s ...
  • 一、BOM對象 1,window對象 所有瀏覽器都支持window對象,從概念上講:一個HTML文檔對應一個window對象,從功能上講:控制瀏覽器視窗的,從使用上講:window對象不需要創建對象,直接使用即可 2,window對象方法 3,方法的使用 3.1彈窗方法,警告窗alert、確認窗co ...
  • Scrapy Scrapy 是一個位了爬取網站數據,提取數據結構性數據而編寫的應用框架,少量代碼,就能快速爬取,使用了Twisted 非同步網路框架,加快我們下載速度! 工作流程 製作 Scrapy 爬蟲 一共需要4步: 新建項目 (scrapy startproject xxx):新建一個新的爬蟲項 ...
  • Guava官方文檔 https://github.com/google/guava/wiki/CollectionUtilitiesExplained 官方文檔這樣描述: " " addresses the common case of having a bunch of objects that ...
  • 1.什麼是AOP? AOP(Aspect-Oriented Programming, 面向切麵編程): 是一種新的方法論, 是對傳統 OOP(Object-Oriented Programming, 面向對象編程) 的補充,它的主要編程對象是切麵(aspect), 而切麵模塊化橫切關註點.在應用 A ...
  • 快速讀入模版 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...