python 抽象基類(abc)

來源:互聯網
上載者:User

標籤:理解   can   methods   強制   對象   type   bst   nes   acl   

設定ABCMeta元類

  抽象類別是一類用於繼承,但是無需實現具體方法的類,它會建立一些子類必須實現的方法簽名。抽象類別在定義和強制類抽象方面非常有用,它類似於其他變成語言裡面的介面概念,無需實現具體方法。

  從概念上來講,有一種實現抽象類別的方式是對類方法進行存根,然後在類方法被訪問的時候直接拋出NotImplementedError異常。這樣可以防止子類在沒有重寫類方法之前直接存取父類的類方法。

像這樣:

class Fruit:        def check_ripeness(self):        raise NotImplementedError("check_ripeness method not implemented!")class Apple(Fruit):    passa = Apple()a.check_ripeness() # raises NotImplementedError

  以這種方式建立抽象類別可以防止不恰當的使用沒有被重寫的類方法,當然我們鼓勵在子類中定義這些抽象類別方法,但卻不強制定義。利用abc模組可以防止子類在沒有成功地重寫父類及其祖先類中抽象類別方法之前被執行個體化。

from abc import ABCMetaclass AbstractClass(object):    # metaclass 屬性必須要設定成類屬性     __metaclass__ = ABCMeta   # abstractmethod裝飾器, 用來註冊該方法為未Binder 方法   @abstractmethod    def virtual_method_subclasses_must_define(self):       # 可以直接不寫,也可以提供基礎的實現       # 注意,通常來說,如果不寫的話,它會隱式的返回None,       # 但是通過這樣註冊的話,它不會強制返回None

  現在就可以簡化子類和重寫抽象類別方法了:

class Subclass(AbstractClass):    def virtual_method_subclasses_must_define(self):        return ‘whatever‘

為什麼要使用ABCMeta和abstractmethod,如何使用它們

  抽象基類(ABCs) 強制衍生類別實現基類中的特定方法。

  為了理解它是如何工作的以及為什麼要使用它,我們舉個例子來看一下。比如說,我們有一個基類 "MontyPython",裡面有兩個方法(joke和punchline)必須要在所有的衍生類別中實現:

class MontyPython:    def joke(self):        raise NotImplementedError()    def punchline(self):        raise NotImplementedError()class ArgumentClinic(MontyPython):    def joke(self):        return "Hahahahahah"

  當我們執行個體化出一個對象,並且調用它的這兩個方法,在調用punchline的時候會報錯:

>>> sketch = ArgumentClinic()  >>> sketch.punchline() NotImplementedError 

  但是,我們還是可以正常的執行個體化ArgumentClinic類,並不會出現任何報錯。事實上,只有在我們訪問punchline()方法的時候才會報錯。

  如果使用抽象基類(ABC)模組就不會出現這種問題。通過下面的例子我們來看一下它是如何工作的:

from abc import ABCMeta, abstractmethodclass MontyPython(metaclass=ABCMeta):    @abstractmethod    def joke(self):        pass    @abstractmethod    def punchline(self):        passclass ArgumentClinic(MontyPython):    def joke(self):        return "Hahahahahah"

  現在當我們再執行個體化這個不完整的類的時候,它馬上就會報TypeErrors的錯誤!

>>> c = ArgumentClinic()TypeError:"Can‘t instantiate abstract class ArgumentClinic with abstract methods punchline"

  這種情況下,我們可以通過在子類中實現這兩個抽象類別都TypeErrors的錯誤。

class ArgumentClinic(MontyPython):    def joke(self):        return "Hahahahahah"    def punchline(self):        return "Send in the constable!"

  現在,你就可以正常的執行個體化ArgumentClinic類了。

python 抽象基類(abc)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.