抽象基类:(abstract base class,ABC)
抽象类就是类里定义了纯虚成员函数的类。纯虚函数一般只提供了接口,并不会做具体实现(虽然可以),实现由它的派生类去重写。抽象类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。简言之,ABC描述的是至少使用一个纯虚函数的接口,从ABC派生出的类将根据派生类的具体特征,使用常规虚函数来实现这种接口。
一种学院派思想认为,如果要设计类继承层次,则只能将那些不会被用作基类的类设计为具体的类。这种设计方法更清晰,复杂度低。
定义抽象基类是为了给子类继承实现具体的功能,它是”残缺的类“,里面没有抽象方法的具体代码,里面的抽象方法是被子类重写的!
import abc
class Zoo(metaclass=abc.ABCMeta):
@abc.abstractmethod
def monkey(self):
pass
@abc.abstractmethod
def duck(self):
pass
def elephant(self):
print("I am sleep.")
class SubZoo(Zoo):
def monkey(self):
print("I like banana.")
def duck(self):
print("Gua GUa Gua...")
sz = SubZoo()
sz.duck()
sz.monkey()
sz.elephant()
在Zoo()中定义了两个抽象方法monkey()和duck(),这两个方法必须要由子类重写,如果子类没有重写该方法,在实例化子类时程序就会抛出异常,即使没有调用该方法也会抛出异常。
TypeError: Can't instantiate abstract class SubZoo with abstract methods monkey
elephant()没有被装饰,所以它不是抽象方法,子类不必重写该方法,可以通过继承被访问到。
作为基类是不可以实例化的,如果强行对它实例化,程序将抛出异常
TypeError: Can't instantiate abstract class Zoo with abstract methods duck, monkey