程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> 學習Python的ABC模塊

學習Python的ABC模塊

編輯:Python

1.abc模塊作用

Python本身不提供抽象類和接口機制,要想實現抽象類,可以借助abc模塊。ABC是Abstract Base Class的縮寫。

2.模塊中的類和函數

#### abc.ABCMeta
這是用來生成抽象基礎類的元類。由它生成的類可以被直接繼承。

from abc import ABCMeta

class MyABC:
    __metaclass__ = ABCMeta

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)

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

另外,也可以通過復寫__subclasshook__(subclass)來實現相同功能,它必須是classmethod

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 C:
    __metaclass__ = ABCMeta
    @abstractmethod
    def my_abstract_method(self, ...):
        ...

abc.abstractproperty([fget[,fset[,fdel[,doc]]]])

表明一個抽象屬性

class C:
    __metaclass__ = ABCMeta
    @abstractproperty
    def my_abstract_property(self):
        ...

上例只是只讀屬性,如果是讀寫屬性,可以如下:

class C:
    __metaclass__ = ABCMeta
    def getx(self): ...
    def setx(self, value): ...
    x = abstractproperty(getx, setx)
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved