一、抽象基类
抽象基类:abstract base class,缩写为abc,即对用abc模块
维基百科对抽象类的定义:
抽象类被定义为永远不会也不能被实例化为具体的对象。它往往用于定义一种抽象上的概念,在类的继承关系中它往往被定义在较上层的位置。在程序设计的实践活动中,抽象类与接口存在类似的地方,即它更偏重于对共通的方法和属性进行规约。但与接口存在一个非常大的差异则在于,抽象类往往可以规约一个共同的方法和属性时提供一个对他们的实现。
学过C++的话,都知道C++就是通过定义纯虚函数,如下形式:
virtual void foo() = 0;
来指明抽象类,该类不能被实例化,继承该类的子类通过重写(overide)该虚函数实现不同的功能。
Python类也有多态性,实现也是通过抽象类,不过需要导入abc模块。
二、abc模块
组成:
1)abc.ABCMeta 这是用来生成抽象基础类的元类。由它生成的类可以被直接继承。
2)abc.ABC辅助类,让你可以不用关心元类概念,直接继承它,就有了ABCMeta元类。使用时注意元类冲突
3)@abc.abstractmethod 定义抽象方法,通过@abc.abstractmethod将方法声明为抽象方法。除了这个装饰器,其余装饰器都被deprecated了。
ABCmeta对应__metaclass__属性的值
@abstractmethod装饰器用来指明抽象方法
例子:
from abc import ABCMeta, abstractmethod
class Pet(object, metaclass=ABCMeta):
"""抽象基类Pet"""
def __init__(self, nickname):
self._nickname = nickname
@abstractmethod
def make_voice(self):
pass
class Dog(Pet):
def make_voice(self):
print('%s: 汪汪汪...' % self._nickname)
class Cat(Pet):
def make_voice(self):
print('%s: 喵喵喵...' % self._nickname)
if __name__ == '__main__':
dog = Dog("旺财")
dog.make_voice()
cat = Cat('汤姆')
cat.make_voice()
输出为:
旺财: 汪汪汪...
汤姆: 喵喵喵...