【一】什么是抽象类
- 抽象类是一种不能被实例化的类,它充当了一种模板或者说是蓝图。在抽象类中,你可以定义一些抽象方法,这些抽象方法没有具体的实现,即没有方法体。它们必须在抽象类的子类中被实现,除非那个子类也是一个抽象类。抽象类可以包含具体方法(已实现的方法)和抽象方法(未实现的方法)。
【二】为什么要有抽象类
-
如果不想用鸭子类型,就想用父类来达到规范子类的效果,就可以引入这个抽象类
-
代码重用和分离:抽象类允许你定义一些子类应该拥有的通用方法和属性,从而避免代码重复。
-
设计约束和规范:它为其他类提供一个共同的父类,确保所有子类都遵循相同的基本设计,强制子类实现特定的方法。
-
强化架构:使用抽象类可以使得软件架构更加清晰,强化各个类之间的关系和职责。
【三】如何使用抽象类
【1】导入模块
# 一切皆文件
# 利用abc模块实现抽象类
import abc
【2】不按照抽象类规范来就会报错
import abc
class Car(metaclass=abc.ABCMeta):
@abc.abstractmethod
def run(self):
...
@abc.abstractmethod
def music(self):
...
class Benz(Car):
def run(self):
...
car_1 = Benz()
"""
Traceback (most recent call last):
File "D:\python28\面向对象\导读.py", line 297, in <module>
car_1 = Benz()
^^^^^^
TypeError: Can't instantiate abstract class Benz with abstract method music
进程已结束,退出代码1
"""
- 这里Benz子类没有按照抽象类的规范,没有music()方法,所以就会报错
【3】按照抽象类的规范来
import abc
class Car(metaclass=abc.ABCMeta):
@abc.abstractmethod
def run(self):
...
@abc.abstractmethod
def music(self):
...
class Benz(Car):
def run(self):
...
def music(self):
...
car_1 = Benz()
- 只有和父类一模一样,才不会报错
【四】抽象类与接口
- 抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
- 抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计