默认情况下,Python解析器不强制检查对抽象类的继承,即抽象类的子类可能没有实现其中的抽象方法,但是Python并不会报错。
为了避免这种情况,从Python 3.4/2.6开始,Python标准库中提供了abc模块(Abstract Base Classes),为定义Python的抽象基类提供了公共基础。
事实上,Python标准库中的numbers模块和collections模块都是abc模块的典型应用。
1. abc模块的组成
- class ABCMeta(type)#创建抽象基类的元类,abc模块的核心
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()函数的子类
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
版权声明:本文为taiyangdao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。