纯虚函数与抽象类都是Python面向对象中重要的编程范式,用于对继承类做强制性接口实现约定。
abc模块包含了一系列与抽象基类与纯虚函数相关的方法。Python中通过修改元类进行抽象基类的设定。这里Python2与3的语法不一致。Python2中为:
from abc import ABCMeta, abstractmethod
class Test(object):
__metaclass__ = ABCMeta
而Python3中为:
from abc import ABC, abstractmethod
class Test(ABC):
可见Python2中通过修改__metaclass__类变量指定元类,而Python3中直接继承ABC类即可。
一个抽象基类只能被继承,而其本身无法被实例化。在抽象基类中可定义纯虚函数,又称为抽象方法。这样的方法类似于其他语言中的接口声明,只能够被继承类重写后进行调用,其本身无法被调用。且继承此抽象基类的所有类必须强制实现基类中定义的所有纯虚函数,否则代码将报错。可见,纯虚函数是对当前抽象基类的继承者所进行的一种接口约束,如果想要继承当前父类,则需要实现父类中所规定的必须实现的接口。
纯虚函数通过abstractmethod装饰器进行声明:
from abc import ABC, abstractmethod
class Test(ABC):
@abstractmethod
def absMethod(self):
pass
class InsTest(Test):
def absMethod(self):
print('abstractmethod')
test = InsTest()
test.absMethod()
上例中,继承自Test父类的子类InsTest必须实现父类中定义的所有纯虚函数。纯虚函数的实现只要求函数名一致,参数声明可以不一致。