【Python】抽象基類ABC

抽象基類(Abstract Base Classes)的核心作用

抽象基類(ABC)是Python中一種特殊的類,它通過abc模塊實現,主要服務于面向對象編程中的接口規范和設計約束。以下是它的核心作用:

1. 強制接口實現(核心作用)

確保子類必須實現特定的方法,否則在實例化時會報錯。

from abc import ABC, abstractmethodclass Vehicle(ABC):@abstractmethoddef start_engine(self):  # 子類必須實現這個方法passclass Car(Vehicle):def start_engine(self):  # 必須實現抽象方法print("汽車引擎啟動")# 如果不實現start_engine,實例化時會報錯
# class Bike(Vehicle): pass  
# Bike()  # TypeError!

2. 定義清晰的接口契約

明確聲明一個類應該提供哪些功能,使代碼更易理解和維護。

class Database(ABC):@abstractmethoddef connect(self):"""必須實現數據庫連接方法"""@abstractmethoddef execute_query(self, query):"""必須實現查詢執行方法"""

3. 防止直接實例化基類

抽象基類本身不能被實例化,只能通過具體子類使用。

class Animal(ABC):@abstractmethoddef make_sound(self):pass# Animal()  # 報錯:無法實例化抽象類

4. 實現"鴨子類型"的類型檢查

使用isinstance()檢查對象是否符合特定接口,而不需要實際繼承。

class MyDatabase:  # 沒有繼承Databasedef connect(self): print("連接")def execute_query(self, q): print("執行查詢")Database.register(MyDatabase)  # 注冊為虛擬子類db = MyDatabase()
print(isinstance(db, Database))  # 輸出: True

5. 支持多態設計

為不同實現提供統一接口,實現設計模式如策略模式、工廠模式等。

class Renderer(ABC):@abstractmethoddef render(self, data):passclass HTMLRenderer(Renderer):def render(self, data):return f"<html>{data}</html>"class JSONRenderer(Renderer):def render(self, data):return f'{{"data": "{data}"}}'# 多態調用
renderers = [HTMLRenderer(), JSONRenderer()]
for r in renderers:print(r.render("Hello"))

6. 文檔化接口

作為代碼自文檔化工具,明確展示類應該實現哪些方法。

實際應用場景

  1. 框架開發:定義插件接口規范

    class PluginBase(ABC):@abstractmethoddef initialize(self, config):pass@abstractmethoddef execute(self, input_data):pass
    
  2. API設計:強制第三方實現必要方法

    class PaymentGateway(ABC):@abstractmethoddef process_payment(self, amount):pass
    
  3. 大型項目:保持代碼一致性

    class DataValidator(ABC):@abstractmethoddef validate(self, data):"""所有數據驗證器必須實現此方法"""
    
  4. 測試:創建模擬對象必須實現的接口

    class MockDB(ABC):@abstractmethoddef get_record(self, id):pass
    

與普通基類的區別

特性普通基類抽象基類(ABC)
實例化可以直接實例化不能直接實例化
方法實現可以提供默認實現可以強制要求子類實現
類型檢查必須實際繼承支持虛擬子類注冊
設計意圖代碼復用接口規范

抽象基類特別適合中大型項目,當需要嚴格定義接口規范時,它能顯著提高代碼的可維護性和可擴展性。

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

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

相關文章

[python] Python單例模式:__new__與線程安全解析

一 實例的創建過程 我們之前了解過在構造一個類的實例化對象時,會默認調用__init__方法&#xff0c;也就是類的初始化也叫構造函數&#xff0c;但其實在調用__init__方法前會首先調用__new__方法&#xff08;只有在py3新式類才有&#xff09;。即下面 __new__(): 創建實例 作…

筆記本電腦打開網頁很慢,一查ip地址網段不對怎么處理

我有一個筆記本&#xff0c;在家里連WIFI后獲取到的ip地址網段不對&#xff0c;那么常規做法是手動去配置個靜態IP和DNS&#xff0c;要知道筆記本IP地址默認采用的是DHCP&#xff0c;也就是動態獲取ip地址。如果手動設置靜態IP&#xff0c;也就是固定IP的話&#xff0c;你換個場…

怎樣將MM模塊常用報表設置為ALV默認格式(MB52、MB5B、ME2M、ME1M等)

【SAP系統研究】 對SAP系統中的報表,最方便的格式就是ALV了,可排序、可導出,非常友好。 但有些常見報表卻不是默認ALV界面的,譬如MB52: 是不是有點別扭?但其實是可以后臺配置進行調整的。 現將一些常用報表修改為默認ALV的方法進行總結,便于大家使用。 一、MB52、MB5…

Redis——達人探店

達人探店 發布探店筆記 探店筆記類似點評網站的評價&#xff0c;往往是圖文結合&#xff0c;對應的表有兩個&#xff1a; 發布博文對應兩個接口 案例&#xff1a;實現查看發布探店筆記的接口 需求&#xff1a;點擊首頁的探店筆記&#xff0c;會進入詳情頁面&#xff0c;實現…

Git初始化相關配置

Git配置 在Git安裝完成后&#xff0c;windows操作系統上會多出一個Git Bash的軟件&#xff0c;如果是linux或者是macOS&#xff0c;那么直接打開終端&#xff0c;在終端中敲擊命令即可 # 檢查git版本 git -v # 或 git --version在使用git時&#xff0c;需要配置一下用戶名和郵…

MySQL JSON_ARRAYAGG 實現匯總+明細數據展示

一、業務場景 在投注記錄查詢功能中&#xff0c;我們需要展示每個彩票期號(userId lotteryIssue分組)的匯總數據&#xff08;總金額、總注數&#xff09;&#xff0c;同時也要顯示該期號下的所有明細投注記錄。 解決方案&#xff1a;JSON_ARRAYAGG MySQL 5.7 提供的 JSON_A…

【Lua】Redis 自增并設置有效期

【Lua】Redis 自增并設置有效期 方案一 每次執行都會更新有效期 EVAL "local current redis.call(INCRBY, KEYS[1], ARGV[1]);if tonumber(ARGV[2]) > 0 then redis.call(EXPIRE, KEYS[1], ARGV[2]) end;return current;" 1 mycounter 1 10 參數: 1 代表KEY…

CCF第七屆AIOps國際挑戰賽季軍分享(RAG)

分享CCF 第七屆AIOps國際挑戰賽的季軍方案&#xff0c;從我們的比賽經歷來看&#xff0c;并不會&#xff0c;相反&#xff0c;私域領域問答的優秀效果說明RAG真的很重要 歷經4個月的時間&#xff0c;從初賽賽道第1&#xff0c;復賽賽道第2&#xff0c;到最后決賽獲得季軍&…

YOLO v2:目標檢測領域的全面性進化

引言 在YOLO v1取得巨大成功之后&#xff0c;Joseph Redmon等人在2016年提出了YOLO v2&#xff08;也稱為YOLO9000&#xff09;&#xff0c;這是一個在準確率和速度上都取得顯著提升的版本。YOLO v2不僅保持了v1的高速特性&#xff0c;還通過一系列創新技術大幅提高了檢測精度…

Linux-Ubuntu安裝Stable Diffusion Forge

SD Forge在Win上配置起來相對簡單且教程豐富&#xff0c;而在Linux平臺的配置則稍有門檻且教程較少。本文提供一個基于Ubuntu24.04發行版&#xff08;對其他Linux以及SD分支亦有參考價值&#xff09;的Stable Diffusion ForgeUI安裝配置教程&#xff0c;希望有所幫助 本教程以N…

量子計算實用化突破:從云端平臺到國際競合,開啟算力革命新紀元

在硅谷某生物醫藥實驗室&#xff0c;研究員艾米麗正盯著量子計算模擬界面露出微笑 —— 搭載中電信 "天衍" 量子計算云平臺的 880 比特超導量子處理器&#xff0c;用 17 分鐘完成了傳統超算需 3 個月才能跑完的新型抗生素分子鍵合模擬。這個場景標志著量子計算正從 &…

計算機操作系統(七)詳細講解進程的組成與特性,狀態與轉換

計算機操作系統&#xff08;七&#xff09;進程的組成與特性&#xff0c;狀態與轉換 前言一、進程的組成1. 什么是“進程”&#xff1f;2. 進程的三個核心組成部分2.1 PCB&#xff08;進程控制塊&#xff09;—— 進程的“身份證戶口本”2.2 程序段—— 進程的“任務清單”2.3 …

MapReduce基本介紹

核心思想 分而治之&#xff1a;將大規模的數據處理任務分解成多個可以并行處理的子任務&#xff0c;然后將這些子任務分配到不同的計算節點上進行處理&#xff0c;最后將各個子任務的處理結果合并起來&#xff0c;得到最終的結果。 工作流程 Map 階段&#xff1a; 輸入數據被…

Linux操作系統實戰:中斷源碼的性能分析(轉)

Linux中斷是指在Linux操作系統中&#xff0c;當硬件設備或軟件觸發某個事件時&#xff0c;CPU會中斷正在執行的任務&#xff0c;并立即處理這個事件。它是實現實時響應和處理外部事件的重要機制&#xff0c;Linux中斷可以分為兩種類型&#xff1a;硬件中斷和軟件中斷&#xff0…

AI Agent開發第66課-徹底消除RAG知識庫幻覺-帶推理的RAG

開篇 在第64課《AI Agent開發第64課-DIFY和企業現有系統結合實現高可配置的智能零售AI Agent(上)》中我們提到了提示詞Rewrite,同時還講到了2024年年末開始出現的新的理論,并把RAG系統推入到了3.0模式,業界出現了“3R”理念的RAG引擎,基于“3R”理念可以徹底消除RAG的幻覺…

Clion內置宏$PROJECT_DIR$等

CLion 內置宏 文章目錄 CLion 內置宏通用路徑相關宏路徑相對化宏 官方文檔地址&#xff1a; https://www.jetbrains.com/help/clion/built-in-macros.html 通用路徑相關宏 宏名稱含義說明示例$WORKSPACE_DIR$當前項目所屬的工作區根目錄路徑。/home/user/workspace$PROJECT_D…

機器學習基礎課程-5-課程實驗

5.1 實驗介紹 實驗背景 在這個項目中&#xff0c;您將使用1994年美國人口普查收集的數據&#xff0c;選用幾個監督學習算法以準確地建模被調查者的收入。然后&#xff0c;您將根據初步結果從中選擇出最佳的候選算法&#xff0c;并進一步優化該算法以最好地建模這些數據。你的目…

Android RecyclerView自帶的OnFlingListener,Kotlin

Android RecyclerView自帶的OnFlingListener&#xff0c;Kotlin Android啟動應用時屏蔽RecyclerView滑動&#xff0c;延時后再允許滑動&#xff0c;Kotlin-CSDN博客 使用了GestureDetectorRecyclerView的setOnTouchListener檢測用戶的快滑fling事件。發現RecyclerView也自帶了監…

第3.4節 調用鏈路分析服務開發

3.4.1 什么是Code Call Graph&#xff08;CCG&#xff09; Code Call Graph&#xff08;CCG&#xff09;即業務代碼中的調用關系圖&#xff0c;是通過靜態分析手段分析并構建出的一種描述代碼間關系的圖。根據精度不同&#xff0c;一般分為類級別、方法級別、控制流級別&#x…

【Liblib】基于LiblibAI自定義模型,總結一下Python開發步驟

一、前言 Liblib AI&#xff08;哩布哩布 AI&#xff09;是一個集成了先進人工智能技術和用戶友好設計的 AI 圖像創作繪畫平臺和模型分享社區。 強大的圖像生成能力 &#xff1a;以 Stable Diffusion 技術為核心&#xff0c;提供文生圖、圖生圖、圖像后期處理等功能&#xff…