成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Python模塊文檔學(xué)習(xí)之抽象基類(lèi)abc模塊

lauren_liuling / 769人閱讀

摘要:里面關(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

相關(guān)文章

  • Python基礎(chǔ)之接口——從協(xié)議到抽象基類(lèi)

    摘要:本文重點(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中非正式的接...

    TwIStOy 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路30-接口:從協(xié)議到抽象基類(lèi)

    摘要:本篇內(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...

    LucasTwilight 評(píng)論0 收藏0
  • 流暢的python讀書(shū)筆記-第11章-接口:從協(xié)議到抽象基類(lèi)

    摘要:自己定義的抽象基類(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)...

    Kyxy 評(píng)論0 收藏0
  • python標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)之zipfile模塊

    摘要:模塊里有兩個(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è)文...

    Magicer 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路25-使用一等函數(shù)實(shí)現(xiàn)設(shè)計(jì)模式

    摘要:本篇主要講述中使用函數(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...

    econi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<