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

你可能感兴趣的:(Python)