最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中實(shí)現(xiàn)接口的三種方式深度解析

 更新時(shí)間:2026年02月27日 09:40:25   作者:JohnnyHaytham  
這篇文章詳細(xì)介紹了Python中實(shí)現(xiàn)接口的三種方式,文章對(duì)比了ABC和Protocol的核心區(qū)別,并提供了實(shí)戰(zhàn)選型建議,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

系統(tǒng)、細(xì)致地梳理 Python 中實(shí)現(xiàn) “接口” 的所有方式,并重點(diǎn)對(duì)比 Protocol(協(xié)議類)和 ABC(抽象基類)—— 這是 Python 中定義接口、約束類行為的兩大核心方案,我會(huì)從接口的本質(zhì)出發(fā),先講基礎(chǔ)實(shí)現(xiàn)方式,再深度解析 ABCProtocol 的區(qū)別、用法、適用場(chǎng)景,幫你建立完整的知識(shí)體系。

一、先明確:Python 中 “接口” 的本質(zhì)

在編程中,接口(Interface) 的核心目的是:

定義一套 “行為規(guī)范”(方法 / 屬性),約束實(shí)現(xiàn)類必須提供這些行為,從而保證代碼的一致性、可擴(kuò)展性。

Python 作為動(dòng)態(tài)類型語(yǔ)言,沒(méi)有像 Java/C# 那樣的 interface 關(guān)鍵字,但通過(guò)多種方式實(shí)現(xiàn)了 “接口” 的核心訴求,主要分為 3 類:

  1. 非正式接口(鴨子類型):無(wú)顯式約束,靠約定實(shí)現(xiàn);
  2. 正式接口 - ABC(抽象基類):強(qiáng)制約束,基于繼承;
  3. 正式接口 - Protocol(協(xié)議類):靈活約束,基于結(jié)構(gòu)(鴨子類型的顯式聲明)。

二、Python 接口實(shí)現(xiàn)方式全梳理

方式 1:非正式接口(鴨子類型)—— 最基礎(chǔ)的 “接口”

核心邏輯

不定義任何專門的 “接口類”,僅通過(guò)編程約定規(guī)定:“只要類實(shí)現(xiàn)了指定方法 / 屬性,就視為符合該接口”(即 “像鴨子一樣走、叫,就是鴨子”)。

示例:夾爪接口的非正式實(shí)現(xiàn)

# 約定:所有夾爪類必須實(shí)現(xiàn) gripper_open/gripper_close 方法(無(wú)顯式約束)
class RealGripper:
    def gripper_open(self):
        print("真實(shí)夾爪打開(kāi)")
    def gripper_close(self):
        print("真實(shí)夾爪關(guān)閉")
class SimGripper:
    def gripper_open(self):
        print("仿真夾爪打開(kāi)")
    def gripper_close(self):
        print("仿真夾爪關(guān)閉")
# 使用接口的函數(shù):默認(rèn)傳入的對(duì)象實(shí)現(xiàn)了指定方法
def control_gripper(gripper):
    gripper_open()  # 若未實(shí)現(xiàn),運(yùn)行時(shí)才會(huì)報(bào)錯(cuò)
    gripper_close()
# 調(diào)用(符合約定則正常運(yùn)行)
control_gripper(RealGripper())
control_gripper(SimGripper())

優(yōu)缺點(diǎn)

表格

優(yōu)點(diǎn)缺點(diǎn)
極度靈活,無(wú)語(yǔ)法約束無(wú)靜態(tài)檢查,錯(cuò)誤僅在運(yùn)行時(shí)暴露
無(wú)需繼承,代碼簡(jiǎn)潔無(wú)明確的 “接口文檔”,協(xié)作時(shí)易遺漏方法
適配性強(qiáng),兼容所有類無(wú)法批量驗(yàn)證 “哪些類符合接口”

方式 2:正式接口 - ABC(抽象基類)—— 強(qiáng)制約束的接口

核心原理

通過(guò) abc 模塊的 ABCMeta(抽象元類)和 @abstractmethod 裝飾器,強(qiáng)制子類實(shí)現(xiàn)指定方法

  • 抽象基類中標(biāo)記為 @abstractmethod 的方法,子類必須實(shí)現(xiàn),否則無(wú)法實(shí)例化;
  • 子類必須顯式繼承抽象基類;
  • 支持運(yùn)行時(shí)類型檢查(isinstance/issubclass)。

完整用法示例

from abc import ABC, abstractmethod  # ABC 是繼承了 ABCMeta 的便捷類
# 定義抽象基類(接口):強(qiáng)制子類實(shí)現(xiàn)指定方法
class GripperABC(ABC):
    # 抽象方法:子類必須實(shí)現(xiàn),否則無(wú)法實(shí)例化
    @abstractmethod
    def gripper_open(self):
        """打開(kāi)夾爪(抽象方法,無(wú)實(shí)現(xiàn))"""
        pass
    @abstractmethod
    def gripper_close(self):
        """關(guān)閉夾爪(抽象方法,無(wú)實(shí)現(xiàn))"""
        pass
    # 可選:非抽象方法(子類可繼承/重寫)
    def gripper_status(self):
        """獲取夾爪狀態(tài)(默認(rèn)實(shí)現(xiàn))"""
        return "未知狀態(tài)"
# 正確實(shí)現(xiàn):子類必須覆蓋所有抽象方法
class RealGripper(GripperABC):
    def gripper_open(self):
        print("真實(shí)夾爪打開(kāi)")
    def gripper_close(self):
        print("真實(shí)夾爪關(guān)閉")
# 錯(cuò)誤實(shí)現(xiàn):未實(shí)現(xiàn)所有抽象方法 → 無(wú)法實(shí)例化
class BadGripper(GripperABC):
    def gripper_open(self):
        print("僅實(shí)現(xiàn)打開(kāi)")
    # 未實(shí)現(xiàn) gripper_close → 實(shí)例化時(shí)報(bào)錯(cuò)
# 測(cè)試1:正確子類可實(shí)例化
real_gripper = RealGripper()
real_gripper.gripper_open()  # 正常執(zhí)行
print(real_gripper.gripper_status())  # 繼承默認(rèn)方法
# 測(cè)試2:錯(cuò)誤子類實(shí)例化報(bào)錯(cuò)
# bad_gripper = BadGripper()  # 拋出 TypeError: Can't instantiate abstract class BadGripper with abstract method gripper_close
# 測(cè)試3:運(yùn)行時(shí)類型檢查(支持)
print(isinstance(real_gripper, GripperABC))  # True

關(guān)鍵特性

  1. 強(qiáng)制約束:抽象方法必須被子類實(shí)現(xiàn),否則無(wú)法創(chuàng)建實(shí)例(編譯級(jí)別的約束,提前暴露錯(cuò)誤);
  2. 繼承要求:子類必須顯式繼承抽象基類(class SubClass(ABCClass));
  3. 混合方法:可同時(shí)包含抽象方法(必須實(shí)現(xiàn))和普通方法(默認(rèn)實(shí)現(xiàn),子類可重寫);
  4. 注冊(cè)虛擬子類:通過(guò) @ABC.register 可將未繼承的類 “注冊(cè)” 為子類(僅類型檢查生效,不強(qiáng)制實(shí)現(xiàn)方法):
@GripperABC.register
class VirtualGripper:  # 未繼承 GripperABC,但注冊(cè)為虛擬子類
    def gripper_open(self): pass
    # 即使未實(shí)現(xiàn) gripper_close,也能通過(guò) issubclass 檢查
print(issubclass(VirtualGripper, GripperABC))  # True

優(yōu)缺點(diǎn)

表格

優(yōu)點(diǎn)缺點(diǎn)
強(qiáng)制約束,提前暴露錯(cuò)誤子類必須顯式繼承,靈活性低
支持運(yùn)行時(shí)類型檢查無(wú)法適配 “已存在的類”(除非改繼承關(guān)系)
可提供默認(rèn)方法實(shí)現(xiàn)虛擬子類注冊(cè)后,無(wú)法強(qiáng)制實(shí)現(xiàn)抽象方法
文檔清晰,接口明確動(dòng)態(tài)添加方法時(shí),無(wú)法觸發(fā)檢查

方式 3:正式接口 - Protocol(協(xié)議類)—— 靈活的結(jié)構(gòu)化接口

核心原理

Python 3.8+ 引入(3.8-3.9 需安裝 typing_extensions),基于 結(jié)構(gòu)性子類型

  • 不要求子類繼承 Protocol 類,只要實(shí)現(xiàn)了協(xié)議中定義的所有方法 / 屬性,就視為 “符合該接口”;
  • 本質(zhì)是 “鴨子類型的顯式聲明”,既保留靈活性,又有明確的接口規(guī)范;
  • 默認(rèn)僅支持靜態(tài)檢查(編輯器 /mypy),加 @runtime_checkable 后支持運(yùn)行時(shí)檢查。

完整用法示例

步驟 1:基礎(chǔ) Protocol(僅靜態(tài)檢查)

from typing import Protocol
# 定義協(xié)議(接口):規(guī)定夾爪必須有 gripper_open/gripper_close 方法
class GripperProtocol(Protocol):
    def gripper_open(self):
        """打開(kāi)夾爪(僅定義簽名,無(wú)實(shí)現(xiàn))"""
        ...  # 用 ... 代替 pass,更符合協(xié)議的語(yǔ)義
    def gripper_close(self):
        """關(guān)閉夾爪"""
        ...
# 實(shí)現(xiàn)類:無(wú)需繼承 Protocol,只要實(shí)現(xiàn)指定方法就符合接口
class RealGripper:
    def gripper_open(self):
        print("真實(shí)夾爪打開(kāi)")
    def gripper_close(self):
        print("真實(shí)夾爪關(guān)閉")
class SimGripper:
    def gripper_open(self):
        print("仿真夾爪打開(kāi)")
    def gripper_close(self):
        print("仿真夾爪關(guān)閉")
# 使用接口的函數(shù):參數(shù)標(biāo)注為 Protocol 類型
def control_gripper(gripper: GripperProtocol):
    gripper.gripper_open()
    gripper.gripper_close()
# 測(cè)試1:靜態(tài)檢查(編輯器提示)
# 若傳入的對(duì)象未實(shí)現(xiàn)指定方法,PyCharm/mypy 會(huì)標(biāo)紅(運(yùn)行時(shí)不報(bào)錯(cuò))
control_gripper(RealGripper())  # 正常運(yùn)行
control_gripper(SimGripper())   # 正常運(yùn)行
# 測(cè)試2:默認(rèn)不支持運(yùn)行時(shí)檢查
# print(isinstance(RealGripper(), GripperProtocol))  # 拋出 TypeError

步驟 2:加 @runtime_checkable(支持運(yùn)行時(shí)檢查)

from typing import Protocol
from typing_extensions import runtime_checkable  # Python3.10+ 可從 typing 導(dǎo)入
# 裝飾器開(kāi)啟運(yùn)行時(shí)檢查
@runtime_checkable
class GripperProtocol(Protocol):
    def gripper_open(self): ...
    def gripper_close(self): ...
# 測(cè)試:運(yùn)行時(shí)檢查生效
real_gripper = RealGripper()
print(isinstance(real_gripper, GripperProtocol))  # True
# 未實(shí)現(xiàn)完整方法的類 → 檢查失敗
class BadGripper:
    def gripper_open(self): pass  # 僅實(shí)現(xiàn)一個(gè)方法
print(isinstance(BadGripper(), GripperProtocol))  # False

關(guān)鍵特性

  1. 無(wú)繼承約束:實(shí)現(xiàn)類無(wú)需繼承 Protocol,只要 “結(jié)構(gòu)匹配”(有指定方法 / 屬性)就符合接口;
  2. 靜態(tài)檢查優(yōu)先:默認(rèn)在編輯器 /mypy 階段提示錯(cuò)誤,提前規(guī)避問(wèn)題;
  3. 運(yùn)行時(shí)檢查可選@runtime_checkable 裝飾器開(kāi)啟運(yùn)行時(shí) isinstance 檢查;
  4. 支持屬性約束:不僅能約束方法,還能約束屬性(包括只讀 / 可寫):
@runtime_checkable
class GripperProtocol(Protocol):
    # 約束必須有只讀屬性 status
    @property
    def status(self) -> str: ...
    def gripper_open(self): ...
class RealGripper:
    @property
    def status(self):
        return "open"
    def gripper_open(self): pass
print(isinstance(RealGripper(), GripperProtocol))  # True

優(yōu)缺點(diǎn)

表格

優(yōu)點(diǎn)缺點(diǎn)
極度靈活,無(wú)需繼承默認(rèn)僅支持靜態(tài)檢查,運(yùn)行時(shí)檢查需加裝飾器
適配已有類(無(wú)需改代碼)無(wú)法強(qiáng)制子類實(shí)現(xiàn)方法(僅提示,不報(bào)錯(cuò))
支持屬性 / 方法約束Python3.8+ 才支持(低版本需裝擴(kuò)展)
文檔清晰,語(yǔ)義明確虛擬結(jié)構(gòu)匹配可能導(dǎo)致 “誤判”(如方法名相同但邏輯不同)

三、ABC vs Protocol 深度對(duì)比(核心重點(diǎn))

表格

維度ABC(抽象基類)Protocol(協(xié)議類)
核心思想基于 “繼承” 的接口約束(名義子類型)基于 “結(jié)構(gòu)” 的接口約束(結(jié)構(gòu)性子類型)
繼承要求子類必須顯式繼承 ABC 類無(wú)需繼承,結(jié)構(gòu)匹配即可
方法約束@abstractmethod 強(qiáng)制實(shí)現(xiàn)僅靜態(tài)提示,不強(qiáng)制實(shí)現(xiàn)
運(yùn)行時(shí)檢查默認(rèn)支持(isinstance/issubclass需加 @runtime_checkable 才支持
默認(rèn)實(shí)現(xiàn)支持(可在 ABC 中寫普通方法)不支持(僅定義簽名,無(wú)實(shí)現(xiàn))
適用場(chǎng)景1. 需要強(qiáng)制子類實(shí)現(xiàn)方法;2. 定義有默認(rèn)實(shí)現(xiàn)的基類;3. 低版本 Python(<3.8)1. 無(wú)需繼承的靈活接口;2. 適配已有類(不改繼承關(guān)系);3. 僅需靜態(tài)檢查的場(chǎng)景
錯(cuò)誤暴露時(shí)機(jī)實(shí)例化時(shí)(提前暴露)靜態(tài)檢查階段(編輯器)/ 運(yùn)行時(shí)(加裝飾器后)
版本支持Python2/3 均支持(內(nèi)置 abc 模塊)Python3.8+ 原生支持;3.8 - 需裝 typing_extensions

四、實(shí)戰(zhàn)選型建議(怎么選?)

  • 選 ABC 的場(chǎng)景
    • 你需要強(qiáng)制子類實(shí)現(xiàn)指定方法(比如框架核心接口,不允許遺漏);
    • 接口需要提供默認(rèn)方法實(shí)現(xiàn)(比如通用邏輯,子類可直接繼承);
    • 項(xiàng)目運(yùn)行在 Python3.8 以下版本;
    • 示例:框架基類(如 ArmBase/GripperBase)、必須遵守的核心接口。
  • 選 Protocol 的場(chǎng)景
    • 你需要靈活的接口,不想限制子類的繼承關(guān)系(比如適配第三方庫(kù)的類);
    • 僅需靜態(tài)檢查(編輯器提示),無(wú)需強(qiáng)制約束;
    • 想給 “鴨子類型” 加顯式的接口文檔;
    • 示例:業(yè)務(wù)層接口(如夾爪 / 機(jī)械臂的統(tǒng)一調(diào)用接口)、適配多類實(shí)現(xiàn)的場(chǎng)景。
  • 選非正式接口(鴨子類型)的場(chǎng)景
    • 小型項(xiàng)目 / 腳本,接口簡(jiǎn)單,無(wú)需顯式約束;
    • 快速原型開(kāi)發(fā),無(wú)需嚴(yán)格的接口規(guī)范。

五、總結(jié)

  1. Python 中實(shí)現(xiàn)接口的 3 種方式:
    • 非正式接口:靠約定,無(wú)約束,靈活但易出錯(cuò);
    • ABC:基于繼承,強(qiáng)制約束,支持運(yùn)行時(shí)檢查,適合核心接口;
    • Protocol:基于結(jié)構(gòu),無(wú)繼承約束,默認(rèn)靜態(tài)檢查,加裝飾器支持運(yùn)行時(shí)檢查,適合靈活接口。
  2. ABC 和 Protocol 的核心區(qū)別:
    • ABC 是 “名義上的接口”(繼承即符合),Protocol 是 “結(jié)構(gòu)上的接口”(實(shí)現(xiàn)方法即符合);
    • ABC 強(qiáng)制實(shí)現(xiàn),Protocol 僅提示不強(qiáng)制。
  3. 選型核心:
    • 要 “強(qiáng)制約束” 選 ABC,要 “靈活適配” 選 Protocol;
    • 低版本選 ABC,高版本優(yōu)先選 Protocol(更符合 Python 鴨子類型的設(shè)計(jì)哲學(xué))。

補(bǔ)充:

一、Protocol 相比非正式接口(鴨子類型)的特殊之處

非正式接口完全靠 “編程約定”(比如 “大家都知道夾爪要實(shí)現(xiàn) open/close 方法”),而 Protocol 是鴨子類型的 “顯式化、標(biāo)準(zhǔn)化升級(jí)”,核心特殊之處有 3 點(diǎn):

表格

特性非正式接口(鴨子類型)Protocol 協(xié)議類
接口文檔化隱性約定,無(wú)明確的 “接口定義”,新人接手需看注釋 / 源碼顯式定義接口(類 + 方法簽名),一眼就能知道 “符合接口的類需要實(shí)現(xiàn)什么”
靜態(tài)檢查支持無(wú)(編輯器不會(huì)提示錯(cuò)誤,只有運(yùn)行時(shí)才會(huì)發(fā)現(xiàn)缺方法)有(PyCharm/VS Code/mypy 會(huì)在編碼階段標(biāo)紅未實(shí)現(xiàn)方法的錯(cuò)誤)
運(yùn)行時(shí)檢查支持無(wú)(只能手動(dòng)判斷 hasattr(obj, 'method')可選(加 @runtime_checkable 后,用 isinstance 一鍵驗(yàn)證)
代碼可讀性低(需通讀代碼才能知道接口要求)高(Protocol 類就是接口文檔,參數(shù)標(biāo)注 : GripperProtocol 清晰)

極簡(jiǎn)對(duì)比示例

1. 非正式接口(鴨子類型)

# 接口約定:夾爪要有 open/close 方法(僅靠注釋說(shuō)明)
"""
【約定】所有夾爪類必須實(shí)現(xiàn) open()/close() 方法
"""
class RealGripper:
    def open(self): pass  # 符合約定
    # 漏寫 close() → 編碼階段無(wú)提示
# 使用接口的函數(shù)
def control_gripper(gripper):
    gripper.open()
    gripper.close()  # 運(yùn)行時(shí)才會(huì)報(bào)錯(cuò)(AttributeError)
# 編碼階段無(wú)提示,運(yùn)行時(shí)才暴露問(wèn)題
control_gripper(RealGripper())  # 運(yùn)行時(shí)報(bào)錯(cuò):沒(méi)有 close 方法

2. Protocol 接口

from typing import Protocol
# 顯式定義接口:明確要求實(shí)現(xiàn) open/close
class GripperProtocol(Protocol):
    def open(self): ...
    def close(self): ...
# 使用接口的函數(shù):參數(shù)標(biāo)注為 Protocol
def control_gripper(gripper: GripperProtocol):
    gripper.open()
    gripper.close()
class RealGripper:
    def open(self): pass  # 漏寫 close()
# 編碼階段(編輯器)直接標(biāo)紅提示:
# "RealGripper" has no attribute "close" 符合 GripperProtocol 接口
control_gripper(RealGripper())  # 編輯器標(biāo)紅,提前規(guī)避錯(cuò)誤

核心總結(jié):Protocol 把 “隱性的約定” 變成了 “顯性的代碼定義”,讓接口有了 “可檢查、可閱讀、可維護(hù)” 的特性,而非正式接口完全靠人遵守約定,極易出錯(cuò)。

二、Protocol 的 “支持屬性約束” 是什么意思?

“屬性約束” 是指 Protocol 不僅能約束方法(比如 open()/close()),還能約束屬性(包括普通屬性、只讀屬性、可寫屬性)—— 簡(jiǎn)單說(shuō),就是規(guī)定 “符合接口的類必須有某個(gè)屬性,且屬性類型要匹配”。

而非正式接口只能靠約定,無(wú)法在編碼階段檢查屬性是否存在 / 類型是否正確。

示例 1:約束普通屬性

from typing import Protocol
class GripperProtocol(Protocol):
    # 約束:必須有一個(gè)字符串類型的屬性 `status`
    status: str
    # 同時(shí)約束方法
    def open(self): ...
# 符合接口的類:有 status 屬性 + open 方法
class RealGripper:
    def __init__(self):
        self.status = "closed"  # 字符串類型,符合約束
    def open(self):
        self.status = "open"
# 不符合接口的類:無(wú) status 屬性(編輯器標(biāo)紅)
class BadGripper:
    def open(self): pass  # 漏了 status 屬性
# 函數(shù)參數(shù)標(biāo)注為 Protocol,編輯器會(huì)檢查屬性
def get_gripper_status(gripper: GripperProtocol) -> str:
    return gripper.status

示例 2:約束只讀屬性(@property)

更常用的是約束 “只讀屬性”(通過(guò) @property),比如規(guī)定夾爪必須有一個(gè) “只讀的狀態(tài)屬性”:

from typing import Protocol
from typing_extensions import runtime_checkable
@runtime_checkable
class GripperProtocol(Protocol):
    # 約束:必須有一個(gè)只讀屬性 `status`(返回字符串)
    @property
    def status(self) -> str: ...
# 符合接口的類:實(shí)現(xiàn)只讀屬性
class RealGripper:
    def __init__(self):
        self._status = "closed"  # 私有屬性
    @property  # 實(shí)現(xiàn)只讀屬性
    def status(self) -> str:
        return self._status
# 運(yùn)行時(shí)檢查:屬性符合約束 → 返回 True
g = RealGripper()
print(isinstance(g, GripperProtocol))  # True
# 不符合接口的類:無(wú)只讀 status 屬性
class BadGripper:
    status = "closed"  # 普通屬性,不是 @property → 檢查失敗
print(isinstance(BadGripper(), GripperProtocol))  # False

核心總結(jié):“屬性約束” 讓 Protocol 能定義更完整的接口 —— 不僅要求類有指定方法,還要求有指定屬性(甚至約束屬性類型、是否只讀),而非正式接口無(wú)法做到這種精細(xì)化約束。

三、@abstractmethod 必須搭配繼承 ABC 一起使用嗎?

結(jié)論:是的(嚴(yán)格來(lái)說(shuō),是必須搭配 ABCMeta 元類)。

@abstractmethodabc 模塊的裝飾器,它的作用是 “標(biāo)記方法為抽象方法,強(qiáng)制子類實(shí)現(xiàn)”,但這個(gè)功能只有在類繼承了 ABC(或指定 metaclass=ABCMeta)時(shí)才生效—— 如果不繼承 ABC,@abstractmethod 只是一個(gè) “空裝飾器”,不會(huì)有任何強(qiáng)制約束效果。

示例 1:正確用法(繼承 ABC + @abstractmethod)

from abc import ABC, abstractmethod
class GripperABC(ABC):  # 繼承 ABC(核心)
    @abstractmethod
    def open(self): ...
# 子類未實(shí)現(xiàn) open() → 實(shí)例化時(shí)報(bào)錯(cuò)
class BadGripper(GripperABC):
    pass
# bad_gripper = BadGripper()  # 拋出 TypeError:無(wú)法實(shí)例化抽象類(缺 open 方法)

示例 2:錯(cuò)誤用法(僅 @abstractmethod,不繼承 ABC)

from abc import abstractmethod
class GripperABC:  # 未繼承 ABC
    @abstractmethod
    def open(self): ...
# 子類未實(shí)現(xiàn) open() → 居然能實(shí)例化!@abstractmethod 完全失效
class BadGripper(GripperABC):
    pass
bad_gripper = BadGripper()  # 無(wú)任何報(bào)錯(cuò)!
bad_gripper.open()  # 運(yùn)行時(shí)報(bào)錯(cuò)(但實(shí)例化階段沒(méi)提示)

補(bǔ)充:ABC 的本質(zhì)是ABCMeta元類

ABC 類其實(shí)是 ABCMeta 元類的便捷封裝,等價(jià)寫法:

from abc import abstractmethod, ABCMeta
# 不繼承 ABC,直接指定元類
class GripperABC(metaclass=ABCMeta):
    @abstractmethod
    def open(self): ...
# 效果和繼承 ABC 完全一致:子類未實(shí)現(xiàn) open() 無(wú)法實(shí)例化

核心總結(jié)

  • @abstractmethod 必須搭配 ABC(或 ABCMeta 元類)使用,否則無(wú)強(qiáng)制約束效果;
  • 這是因?yàn)?ABCMeta 元類重寫了類的實(shí)例化邏輯 —— 當(dāng)檢測(cè)到類中有未實(shí)現(xiàn)的抽象方法時(shí),會(huì)阻止實(shí)例化,而普通類沒(méi)有這個(gè)邏輯。

type 是 object 的子類(繼承關(guān)系),同時(shí) object 是 type 的實(shí)例(創(chuàng)建關(guān)系)。任何類都是type或type子類的實(shí)例,元類是 “類的爹”,類是元類的 “孩子”(實(shí)例);類是 “實(shí)例的爹”,實(shí)例是類的 “孩子”。

到此這篇關(guān)于Python中實(shí)現(xiàn)接口的三種方式的文章就介紹到這了,更多相關(guān)python接口實(shí)現(xiàn)方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python使用json將字符串轉(zhuǎn)字典報(bào)錯(cuò)的解決

    python使用json將字符串轉(zhuǎn)字典報(bào)錯(cuò)的解決

    這篇文章主要介紹了python使用json將字符串轉(zhuǎn)字典報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 淺談PyQt5 的幫助文檔查找方法,可以查看每個(gè)類的方法

    淺談PyQt5 的幫助文檔查找方法,可以查看每個(gè)類的方法

    今天小編就為大家分享一篇淺談PyQt5 的幫助文檔查找方法,可以查看每個(gè)類的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Python使用多進(jìn)程執(zhí)行同一個(gè)函數(shù)的多種方法

    Python使用多進(jìn)程執(zhí)行同一個(gè)函數(shù)的多種方法

    本文介紹了在Python中使用多進(jìn)程執(zhí)行相同函數(shù)的三種方法:Process類、Pool進(jìn)程池和apply_async異步執(zhí)行,比較了各種方法的適用場(chǎng)景、優(yōu)缺點(diǎn),并提供了實(shí)用技巧和注意事項(xiàng),推薦使用Pool進(jìn)程池處理大量任務(wù),它簡(jiǎn)單易用且自動(dòng)負(fù)載均衡,需要的朋友可以參考下
    2026-04-04
  • Python之Numpy的超實(shí)用基礎(chǔ)詳細(xì)教程

    Python之Numpy的超實(shí)用基礎(chǔ)詳細(xì)教程

    這篇文章主要介紹了Python之Numpy的超實(shí)用基礎(chǔ)詳細(xì)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Python+Appium實(shí)現(xiàn)自動(dòng)搶微信紅包

    Python+Appium實(shí)現(xiàn)自動(dòng)搶微信紅包

    不知從何時(shí)開(kāi)始微信紅包橫空出世,對(duì)于網(wǎng)速和手速慢的人只能在一旁觀望,做為python的學(xué)習(xí)者就是要運(yùn)用編程解決生活和工作上的事情。于是我用python解決我們的手速問(wèn)題python實(shí)現(xiàn)自動(dòng)搶微信紅包,至于網(wǎng)速慢得那就只能自己花錢提升了。
    2021-05-05
  • Python Json數(shù)據(jù)文件操作原理解析

    Python Json數(shù)據(jù)文件操作原理解析

    這篇文章主要介紹了Python Json數(shù)據(jù)文件操作原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 基于python純函數(shù)實(shí)現(xiàn)井字棋游戲

    基于python純函數(shù)實(shí)現(xiàn)井字棋游戲

    這篇文章主要介紹了基于python純函數(shù)實(shí)現(xiàn)井字棋游戲,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 在Python的Django框架中生成CSV文件的方法

    在Python的Django框架中生成CSV文件的方法

    這篇文章主要介紹了在Python的Django框架中生成CSV文件的方法,利用到了Python下的csv模塊,需要的朋友可以參考下
    2015-07-07
  • pycharm中代碼回滾到指定版本的兩種實(shí)現(xiàn)方法(附帶截圖展示)

    pycharm中代碼回滾到指定版本的兩種實(shí)現(xiàn)方法(附帶截圖展示)

    在編寫代碼的時(shí)候,經(jīng)常會(huì)出現(xiàn)寫的代碼存在一些問(wèn)題,但是比較難以發(fā)現(xiàn)具體存在的問(wèn)題在哪里,需要將帶代碼恢復(fù)到指定的版本,下面這篇文章主要給大家介紹了關(guān)于pycharm中代碼回滾到指定版本的兩種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2022-06-06
  • pytest實(shí)現(xiàn)多進(jìn)程與多線程運(yùn)行超好用的插件

    pytest實(shí)現(xiàn)多進(jìn)程與多線程運(yùn)行超好用的插件

    本文主要介紹了pytest實(shí)現(xiàn)多進(jìn)程與多線程運(yùn)行超好用的插件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論

临西县| 黄冈市| 高密市| 海南省| 旌德县| 梓潼县| 呼伦贝尔市| 历史| 比如县| 星子县| 牟定县| 锡林浩特市| 南雄市| 宜良县| 鸡东县| 阳信县| 永平县| 寿阳县| 张北县| 衢州市| 象州县| 武冈市| 胶州市| 织金县| 宾阳县| 台前县| 清流县| 东兴市| 新沂市| 西贡区| 浏阳市| 龙泉市| 延长县| 平潭县| 江达县| 通河县| 新乐市| 东阿县| 彭水| 古丈县| 寿宁县|