預設情況下,Python解析器不強制檢查對抽象類的繼承,即抽象類的子類可能沒有實作其中的抽象方法,但是Python并不會報錯。
為了避免這種情況,從Python 3.4/2.6開始,Python标準庫中提供了abc子產品(Abstract Base Classes),為定義Python的抽象基類提供了公共基礎。
事實上,Python标準庫中的numbers子產品和collections子產品都是abc子產品的典型應用。
1. abc子產品的組成
- class ABCMeta(type) #建立抽象基類的元類,abc子產品的核心
def __new__(mcls, name, bases, namespace, **kwargs)
def register(cls, MySubClass) #為MySubClass注冊一個虛拟的子類名
def _dump_registry(cls, file=None)
def __instancecheck__(cls, instance)
def __subclasscheck__(cls, subclass)
- class ABC(metaclass=ABCMeta) #友善使用ABCMeta的輔助類,推薦使用
- def get_cache_token() #傳回目前抽象基類的緩存的token
- def abstractmethod(funcobj) #修飾抽象函數
- class abstractclassmethod(classmethod) #Python 3.3開始過時了,内置classmethod()函數的子類
- class abstractstaticmethod(staticmethod) #Python 3.3開始過時了,内置staticmethod()函數的子類
- class abstractproperty(property) #Python 3.3開始過時了,内置property()函數的子類
2. 應用示例
from abc import ABC, abstractmethod
class MyAbstractClass(ABC):
@abstractmethod
def myabstractmethod(self):
raise NotImplementedError
class MyConcreteA(MyAbstractClass):
pass
class MyConcreteB(MyAbstractClass):
def myabstractmethod(self):
return
參考連結:
https://docs.python.org/3/library/abc.html
https://github.com/python/cpython/tree/3.6/Lib/abc.py