ABC模块的使用
ABC(Abstract Base Class)模块提供了在Python中定义抽象类的方法。
在Python中没有强的类型检查;因此在执行操作的时候,并不需要所操作的对象是严格继承自某一个基类的。只要由相关的属性,就可以访问。但是由的时候,我们会有需求:一些类定义共同的接口,否则抛出异常;虽然也可以通过hasattr()来实现,但是终归是很麻烦。而ABC模块就可以帮我们实现这个功能。所以,Python中的抽象类和C++中的概念和C++中的还是有一些不一样。
abc.ABCMeta
用来定义抽象类的元类。使用该元类来定义一个抽象类。
定义一个抽象基类的方法是将一个类的元类设置为abc.ABCMeta
。
抽象基类的继承有两种方式:
1. 继承。
2. 注册。
代码实现如下:
# coding: utf-8
from abc import ABCMeta, abstractmethod
class MyABC:
__metaclass__ = ABCMeta
@abstractmethod
def amtest(self):
"""abstractf method"""
class InheritImpl(MyABC):
def amtest(self):
print 'InheritImpl'
class RegisterImpl:
def amtest(self):
print 'RegisterImpl'
MyABC.register(RegisterImpl)
if __name__ == '__main__':
ii = InheritImpl()
ii.amtest()
ri = RegisterImpl()
ri.amtest()
print issubclass(InheritImpl, MyABC)
print issubclass(RegisterImpl, MyABC)
代码输出:
InheritImpl
RegisterImpl
True
True
可见InheritImpl和RegisterImpl都使MyABC的子类,继承并实现了虚函数。
使用直接继承的方式,如果子类中没有完全实现相应的虚接口,那么在执行的时候就会报错,但是如果使注册的方式,就没有该限制。
@abstractmethod和@abstractproperty
在上例中,用@abstractmethod声明一个基类中的函数使虚函数。除了该装饰器外,还有@abstractproperty声明一个抽象属性。