摘要:里面關(guān)于抽象類的相關(guān)介紹中并沒有提供抽象類與抽象方法,但是提供了內(nèi)置模塊來模擬實(shí)現(xiàn)抽象類。主要類或函數(shù)這是用來生成抽象基礎(chǔ)類的元類。繼承方式中的抽象類模塊定義了幾個(gè)抽象類。
PEP里面關(guān)于抽象類的相關(guān)介紹:https://www.python.org/dev/pe...
python中并沒有提供抽象類與抽象方法,但是提供了內(nèi)置模塊abc(abstract base class)來模擬實(shí)現(xiàn)抽象類。
主要類或函數(shù):
abc.ABCMeta 這是用來生成抽象基礎(chǔ)類的元類。由它生成的類可以被直接繼承。
abc.ABC輔助類,讓你可以不用關(guān)心元類概念,直接繼承它,就有了ABCMeta元類。使用時(shí)注意元類沖突
@abc.abstractmethod 定義抽象方法,除了這個(gè)裝飾器,其余裝飾器都被deprecated了。
from abc import ABCMeta class MyABC(metaclass=ABCMeta): pass MyABC.register(tuple) assert issubclass(tuple, MyABC) assert isinstance((), MyABC)
上面這個(gè)例子中,首先生成了一個(gè)MyABC的抽象基礎(chǔ)類,然后再將tuple變成它的虛擬子類。然后通過issubclass或者isinstance都可以判斷出tuple是不是出于MyABC類。
另外,也可以通過復(fù)寫__subclasshook__(subclass)來改變issubclass或者isinstance的行為,__subclasshook__(subclass)必須定義為classmethod
class Foo: def __getitem__(self, index): ... def __len__(self): ... def get_iterator(self): return iter(self) class MyIterable(metaclass=ABCMeta): @abstractmethod def __iter__(self): while False: yield None def get_iterator(self): return self.__iter__() @classmethod def __subclasshook__(cls, C): if cls is MyIterable: if any("__iter__" in B.__dict__ for B in C.__mro__): return True return NotImplemented MyIterable.register(Foo)
通過@abc.abstractmethod將方法聲明為抽象方法。
具體化抽象類可以有兩種方式,一種通過注冊(register),另外一種通過繼承。
上面介紹的是注冊方式,
注冊方式的缺點(diǎn):不會(huì)出現(xiàn)在類的MRO (Method Resolution Order),故而也不能通過super()來調(diào)用抽象方法。當(dāng)沒有實(shí)現(xiàn)抽象方法時(shí),實(shí)例化時(shí)候不會(huì)報(bào)錯(cuò),只有在調(diào)用時(shí)候才會(huì)報(bào)錯(cuò)。
下面介紹繼承方式:
繼承方式的優(yōu)點(diǎn):直接從抽象基類派生子類有一個(gè)好處,除非子類實(shí)現(xiàn)抽象基類的抽象方法,否則子類不能實(shí)例化。
繼承方式:
import abc class PluginBase(metaclass= abc.ABCMeta): #__metaclass__ = abc.ABCMeta @abc.abstractmethod def load(self, input): """Retrieve data from the input source and return an object.""" return @abc.abstractmethod def save(self, output, data): """Save the data object to the output.""" return class SubclassImplementation(PluginBase): def load(self, input): return input.read() def save(self, output, data): return output.write(data) if __name__ == "__main__": print "Subclass:", issubclass(SubclassImplementation, PluginBase) print "Instance:", isinstance(SubclassImplementation(), PluginBase)collections中的抽象類
collections.abc模塊定義了幾個(gè)抽象類。
具體請看文檔。
參考:
https://docs.python.org/3/lib...
https://www.python.org/dev/pe...
https://my.oschina.net/u/2253...
http://yansu.org/2013/06/09/l...
http://www.cnblogs.com/Securi...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/38300.html
摘要:本文重點(diǎn)協(xié)議是中非正式的接口了解抽象基類的基本概念以及標(biāo)準(zhǔn)庫中的抽象基類掌握抽象基類的使用方法。三抽象基類的使用通過繼承聲明抽象基類聲明抽象基類最簡單的方式是繼承或其他抽象基類注意在之間,繼承抽象基類的語法是。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之面向?qū)ο笃闹攸c(diǎn)知識及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、協(xié)議是Python中非正式的接...
摘要:本篇內(nèi)容將從鴨子類型的動(dòng)態(tài)協(xié)議,逐漸過渡到使接口更明確能驗(yàn)證實(shí)現(xiàn)是否符合規(guī)定的抽象基類。抽象基類介紹完動(dòng)態(tài)實(shí)現(xiàn)接口后,現(xiàn)在開始討論抽象基類,它屬于靜態(tài)顯示地實(shí)現(xiàn)接口。標(biāo)準(zhǔn)庫中的抽象基類從開始,標(biāo)準(zhǔn)庫提供了抽象基類。 《流暢的Python》筆記。本篇是面向?qū)ο髴T用方法的第四篇,主要討論接口。本篇內(nèi)容將從鴨子類型的動(dòng)態(tài)協(xié)議,逐漸過渡到使接口更明確、能驗(yàn)證實(shí)現(xiàn)是否符合規(guī)定的抽象基類(Abst...
摘要:自己定義的抽象基類要繼承。抽象基類可以包含具體方法。這里想表達(dá)的觀點(diǎn)是我們可以偷懶,直接從抽象基類中繼承不是那么理想的具體方法。 抽象基類 抽象基類的常見用途: 實(shí)現(xiàn)接口時(shí)作為超類使用。 然后,說明抽象基類如何檢查具體子類是否符合接口定義,以及如何使用注冊機(jī)制聲明一個(gè)類實(shí)現(xiàn)了某個(gè)接口,而不進(jìn)行子類化操作。 如何讓抽象基類自動(dòng)識別任何符合接口的類——不進(jìn)行子類化或注冊。 接口在動(dòng)態(tài)類...
摘要:模塊里有兩個(gè)非常重要的分別是和。返回一個(gè)對象,它包括文件的詳細(xì)信息。將文檔內(nèi)的指定文件解壓到當(dāng)前目錄。為文件路徑,為添加到文檔之后保存的名稱參數(shù)表示壓縮方法,它的值可以是或。預(yù)留字段,當(dāng)前實(shí)現(xiàn)總是返回。 ZipFile模塊里有兩個(gè)非常重要的class, 分別是 ZipFile和ZipInfo。ZipFile是主要的類,用來創(chuàng)建和讀取zip文件,而ZipInfo是存儲的zip文件的每個(gè)文...
摘要:本篇主要講述中使用函數(shù)來實(shí)現(xiàn)策略模式和命令模式,最后總結(jié)出這種做法背后的思想。 《流暢的Python》筆記。本篇主要講述Python中使用函數(shù)來實(shí)現(xiàn)策略模式和命令模式,最后總結(jié)出這種做法背后的思想。 1. 重構(gòu)策略模式 策略模式如果用面向?qū)ο蟮乃枷雭砗唵谓忉尩脑挘鋵?shí)就是多態(tài)。父類指向子類,根據(jù)子類對同一方法的不同重寫,得到不同結(jié)果。 1.1 經(jīng)典的策略模式 下圖是經(jīng)典的策略模式的U...
閱讀 3610·2021-11-23 09:51
閱讀 1482·2021-11-04 16:08
閱讀 3554·2021-09-02 09:54
閱讀 3620·2019-08-30 15:55
閱讀 2601·2019-08-30 15:54
閱讀 963·2019-08-29 16:30
閱讀 2051·2019-08-29 16:15
閱讀 2322·2019-08-29 14:05