Python -- abc module

1.ABC模塊做用

Python自己不提供抽象類和接口機制,想要實現抽象類,能夠藉助abc模塊。ABC是Abstract Base Class的縮寫,是用來定義抽象類的,具體的介紹請參考PEP 3119python

2.模塊中的類和函數介紹

abc.ABCMeta,用來生成抽象基礎類的元類。由它生成的類能夠被直接繼承。ssh

register首先註冊一個abc的虛擬子類函數

from abc import ABCMeta 
     
    class MyABC: 
        __metaclass__ = ABCMeta 
     
    MyABC.register(tuple) 
     
    assert issubclass(tuple, MyABC) 
    assert isinstance((), MyABC)

上面這個例子中,首先生成了一個MyABC的抽象基礎類,而後再將tuple變成它的虛擬子類。而後經過issubclass或者isinstance均可以判斷出tuple是否是出於MyABC類。spa

檢查子類是否被確認爲ABC的子類。你也能夠本身定製一個issubclass方法,這樣就不須要再調用register()了。這個方法能夠返回Ture,False或NotImplemented。若是返回的是TRUE,這個子類就被認爲是ABC的子類了。若是返回FALSE,這個子類就不被認爲是ABC的子類。若是是NotImplemented 請檢查 子類的繼承關係和語法。也能夠經過複寫__subclasshook__(subclass)來實現相同功能,它必須是classmethod。code

下面是一個實用的例子:繼承

class Foo(object): 
        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(function),代表抽象方法的生成器接口

class classname:
    __metaclass__ = ABCMeta

    @abstractmethod
    def __my_abstract_method__(self):
        ...

abc.abstractproperty([fget[,fset[,fdel[,doc]]]]),代表一個抽象屬性get

class classname:
    __metaclass__ = ABCMeta

    @abstractproperty
    def my_abstract_property(self):
        ...

上例只是只讀屬性,若是是讀寫屬性,能夠以下:it

相關文章
相關標籤/搜索