摘要:里面關(guān)于抽象類的相關(guān)介紹中并沒(méi)有提供抽象類與抽象方法,但是提供了內(nèi)置模塊來(lái)模擬實(shí)現(xiàn)抽象類。主要類或函數(shù)這是用來(lái)生成抽象基礎(chǔ)類的元類。繼承方式中的抽象類模塊定義了幾個(gè)抽象類。
PEP里面關(guān)于抽象類的相關(guān)介紹:https://www.python.org/dev/pe...
python中并沒(méi)有提供抽象類與抽象方法,但是提供了內(nèi)置模塊abc(abstract base class)來(lái)模擬實(shí)現(xiàn)抽象類。
主要類或函數(shù):
abc.ABCMeta 這是用來(lái)生成抽象基礎(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變成它的虛擬子類。然后通過(guò)issubclass或者isinstance都可以判斷出tuple是不是出于MyABC類。
另外,也可以通過(guò)復(fù)寫__subclasshook__(subclass)來(lái)改變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)
通過(guò)@abc.abstractmethod將方法聲明為抽象方法。
具體化抽象類可以有兩種方式,一種通過(guò)注冊(cè)(register),另外一種通過(guò)繼承。
上面介紹的是注冊(cè)方式,
注冊(cè)方式的缺點(diǎn):不會(huì)出現(xiàn)在類的MRO (Method Resolution Order),故而也不能通過(guò)super()來(lái)調(diào)用抽象方法。當(dāng)沒(méi)有實(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è)抽象類。
具體請(qǐng)看文檔。
參考:
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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/38300.html
摘要:本文重點(diǎn)協(xié)議是中非正式的接口了解抽象基類的基本概念以及標(biāo)準(zhǔn)庫(kù)中的抽象基類掌握抽象基類的使用方法。三抽象基類的使用通過(guò)繼承聲明抽象基類聲明抽象基類最簡(jiǎn)單的方式是繼承或其他抽象基類注意在之間,繼承抽象基類的語(yǔ)法是。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之面向?qū)ο笃闹攸c(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、協(xié)議是Python中非正式的接...
摘要:本篇內(nèi)容將從鴨子類型的動(dòng)態(tài)協(xié)議,逐漸過(guò)渡到使接口更明確能驗(yàn)證實(shí)現(xiàn)是否符合規(guī)定的抽象基類。抽象基類介紹完動(dòng)態(tài)實(shí)現(xiàn)接口后,現(xiàn)在開始討論抽象基類,它屬于靜態(tài)顯示地實(shí)現(xiàn)接口。標(biāo)準(zhǔn)庫(kù)中的抽象基類從開始,標(biāo)準(zhǔn)庫(kù)提供了抽象基類。 《流暢的Python》筆記。本篇是面向?qū)ο髴T用方法的第四篇,主要討論接口。本篇內(nèi)容將從鴨子類型的動(dòng)態(tài)協(xié)議,逐漸過(guò)渡到使接口更明確、能驗(yàn)證實(shí)現(xiàn)是否符合規(guī)定的抽象基類(Abst...
摘要:自己定義的抽象基類要繼承。抽象基類可以包含具體方法。這里想表達(dá)的觀點(diǎn)是我們可以偷懶,直接從抽象基類中繼承不是那么理想的具體方法。 抽象基類 抽象基類的常見用途: 實(shí)現(xiàn)接口時(shí)作為超類使用。 然后,說(shuō)明抽象基類如何檢查具體子類是否符合接口定義,以及如何使用注冊(cè)機(jī)制聲明一個(gè)類實(shí)現(xiàn)了某個(gè)接口,而不進(jìn)行子類化操作。 如何讓抽象基類自動(dòng)識(shí)別任何符合接口的類——不進(jìn)行子類化或注冊(cè)。 接口在動(dòng)態(tài)類...
摘要:模塊里有兩個(gè)非常重要的分別是和。返回一個(gè)對(duì)象,它包括文件的詳細(xì)信息。將文檔內(nèi)的指定文件解壓到當(dāng)前目錄。為文件路徑,為添加到文檔之后保存的名稱參數(shù)表示壓縮方法,它的值可以是或。預(yù)留字段,當(dāng)前實(shí)現(xiàn)總是返回。 ZipFile模塊里有兩個(gè)非常重要的class, 分別是 ZipFile和ZipInfo。ZipFile是主要的類,用來(lái)創(chuàng)建和讀取zip文件,而ZipInfo是存儲(chǔ)的zip文件的每個(gè)文...
摘要:本篇主要講述中使用函數(shù)來(lái)實(shí)現(xiàn)策略模式和命令模式,最后總結(jié)出這種做法背后的思想。 《流暢的Python》筆記。本篇主要講述Python中使用函數(shù)來(lái)實(shí)現(xiàn)策略模式和命令模式,最后總結(jié)出這種做法背后的思想。 1. 重構(gòu)策略模式 策略模式如果用面向?qū)ο蟮乃枷雭?lái)簡(jiǎn)單解釋的話,其實(shí)就是多態(tài)。父類指向子類,根據(jù)子類對(duì)同一方法的不同重寫,得到不同結(jié)果。 1.1 經(jīng)典的策略模式 下圖是經(jīng)典的策略模式的U...
閱讀 3748·2021-11-23 09:51
閱讀 1594·2021-11-04 16:08
閱讀 3688·2021-09-02 09:54
閱讀 3729·2019-08-30 15:55
閱讀 2694·2019-08-30 15:54
閱讀 1046·2019-08-29 16:30
閱讀 2131·2019-08-29 16:15
閱讀 2406·2019-08-29 14:05