天天看點

Python中的抽象基類與标準庫中的abc子產品

預設情況下,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