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