Python如何定義接口和抽象類
問題
你想定義一個(gè)接口或抽象類,并且通過執(zhí)行類型檢查來確保子類實(shí)現(xiàn)了某些特定的方法
解決方案
使用 abc 模塊可以很輕松的定義抽象基類:
from abc import ABCMeta, abstractmethod
class IStream(metaclass=ABCMeta):
@abstractmethod
def read(self, maxbytes=-1):
pass
@abstractmethod
def write(self, data):
pass
抽象類的一個(gè)特點(diǎn)是它不能直接被實(shí)例化,比如你想像下面這樣做是不行的:
a = IStream() # TypeError: Can't instantiate abstract class
# IStream with abstract methods read, write
抽象類的目的就是讓別的類繼承它并實(shí)現(xiàn)特定的抽象方法:
class SocketStream(IStream):
def read(self, maxbytes=-1):
pass
def write(self, data):
pass
抽象基類的一個(gè)主要用途是在代碼中檢查某些類是否為特定類型,實(shí)現(xiàn)了特定接口:
def serialize(obj, stream):
if not isinstance(stream, IStream):
raise TypeError('Expected an IStream')
pass
除了繼承這種方式外,還可以通過注冊(cè)方式來讓某個(gè)類實(shí)現(xiàn)抽象基類:
import io
# Register the built-in I/O classes as supporting our interface
IStream.register(io.IOBase)
# Open a normal file and type check
f = open('foo.txt')
isinstance(f, IStream) # Returns True
@abstractmethod 還能注解靜態(tài)方法、類方法和 properties 。 你只需保證這個(gè)注解緊靠在函數(shù)定義前即可:
class A(metaclass=ABCMeta):
@property
@abstractmethod
def name(self):
pass
@name.setter
@abstractmethod
def name(self, value):
pass
@classmethod
@abstractmethod
def method1(cls):
pass
@staticmethod
@abstractmethod
def method2():
pass
討論
標(biāo)準(zhǔn)庫中有很多用到抽象基類的地方。collections 模塊定義了很多跟容器和迭代器(序列、映射、集合等)有關(guān)的抽象基類。 numbers 庫定義了跟數(shù)字對(duì)象(整數(shù)、浮點(diǎn)數(shù)、有理數(shù)等)有關(guān)的基類。io 庫定義了很多跟I/O操作相關(guān)的基類。
你可以使用預(yù)定義的抽象類來執(zhí)行更通用的類型檢查,例如:
import collections # Check if x is a sequence if isinstance(x, collections.Sequence): ... # Check if x is iterable if isinstance(x, collections.Iterable): ... # Check if x has a size if isinstance(x, collections.Sized): ... # Check if x is a mapping if isinstance(x, collections.Mapping):
盡管ABCs可以讓我們很方便的做類型檢查,但是我們?cè)诖a中最好不要過多的使用它。 因?yàn)镻ython的本質(zhì)是一門動(dòng)態(tài)編程語言,其目的就是給你更多靈活性, 強(qiáng)制類型檢查或讓你代碼變得更復(fù)雜,這樣做無異于舍本求末。
以上就是Python如何定義接口和抽象類的詳細(xì)內(nèi)容,更多關(guān)于Python定義接口和抽象類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python+Matplotlib繪制帶有對(duì)角線的散點(diǎn)圖的示例代碼
Matplotlib 是一個(gè)用于繪制二維圖形的 Python 庫,這篇文章主要介紹了Python如何利用Matplotlib繪制帶有對(duì)角線的散點(diǎn)圖,需要的小伙伴可以參考一下2023-06-06
Pytorch中實(shí)現(xiàn)CPU和GPU之間的切換的兩種方法
本文主要介紹了Pytorch中實(shí)現(xiàn)CPU和GPU之間的切換的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
python+selenium?實(shí)現(xiàn)掃碼免密登錄示例代碼
這篇文章主要介紹了python+selenium?實(shí)現(xiàn)掃碼免密登錄,首先掃碼登錄獲取cookies保存到本地未后面免密登錄做準(zhǔn)備,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Python驗(yàn)證碼識(shí)別處理實(shí)例
這篇文章主要介紹了Python驗(yàn)證碼識(shí)別處理實(shí)例,實(shí)現(xiàn)過程講解很詳細(xì),感興趣的小伙伴們可以參考一下2015-12-12
python openpyxl方法 zip函數(shù)用法及說明
這篇文章主要介紹了python openpyxl方法 zip函數(shù)用法及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
python使用sklearn實(shí)現(xiàn)決策樹的方法示例
這篇文章主要介紹了python使用sklearn實(shí)現(xiàn)決策樹的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

