抽象类是抽象层次上的对象类型的一个定义,该对象类型往往是由许多具体的对象类型提取共性而得到的一个概念,它预定义了一些属性和方法(状态和行为),其中一些方法没有给出实现(抽象方法),而必须由子类来实现,这样的类就是抽象类。现实里能找到很多例子,智能手机、平板电脑这些概念是抽象类,它们定义了智能手机、平板电脑大体上是个什么样子,而苹果、华为、三星的智能手机、平板电脑的设计图纸就相当于子类,它们生产的智能手机、平板电脑产品就是子类的实例。电动汽车、4G、5G、第6代战斗机等等概念都可以看成抽象类。人类社会很多的伟大发明、学术理论都是从提出一个抽象的概念而发展而来,人的创造性的高层次表现就在于擅长提出抽象的概念并给出具体的物理实现。
从语言语法特性来讲,抽象类就是包含有抽象方法的类,它不能被实例化,否则会报错。python2.x里没有语法特性意义上的抽象类,也就是没有抽象方法,也不存在类不能被实例化,但逻辑意义上的抽象类很普遍,比如我们定义一个类,里面有几个方法没有给出具体实现(你直接实例化它什么也干不了),然后需要定义子类对其进行实现,这个类其实就是抽象类。
python3开始从语法特性上支持抽象类,它通过定义了几个装饰器来把类体里面的方法装饰成抽象方法来实现。还有抽象类的元类需要指定为ABCMeta。
def abstractmethod(funcobj):
funcobj.__isabstractmethod__ = True
return funcobj
abstractmethod是用来装饰一个类的实例方法为抽象方法的,也就是给实例方法附加了一个__abstractmethod__标志
class abstractclassmethod(classmethod):
__isabstractmethod__ = True
def __init__(self, callable):
callable.__isabstractmethod__ = True
super().__init__(callable)
abstractclassmethod继承自classmethod,它们是一个非覆盖性描述符类,abstractclassmethod也就是在classmethod的装饰逻辑之上增加了给它们装饰的类方法附加了一个__abstractmethod__标志
class abstractstaticmethod(staticmethod):
__isabstractmethod__ = True
def __init__(self, callable):
callable.__isabstractmethod__ = True
super().__init__(callable)
abstractstaticmethod是把static方法标记为抽象方法,跟abstractclassmethod差不多的意思。
当然把类方法和static方法定义为抽象方法还可以类似这样,这是被鼓励采用的方式
@classmethod
@abstractmethod
def f(cls):pss
在实际定义抽象类时,我们一般是把抽象方法定义为未给出实现的方法,但这不是强制的,其实是可以给出实现,在子类里面通过super调用来调用抽象方法,当然一般不会这样用。