Python 中的抽象类 是一种不能直接实例化 的特殊类,它的核心作用是定义子类必须实现的方法规范,强制子类遵循统一的接口设计。
简单说:抽象类就是「模板」,只规定子类要做什么,不负责具体实现,必须由子类继承并实现它的抽象方法后才能使用。
一、核心知识点
- 依赖模块 :Python 内置
abc模块(Abstract Base Classes)实现抽象类 - 关键装饰器 :
@abstractmethod:标记抽象方法 ,子类必须重写实现
- 规则 :
- 包含抽象方法的类 = 抽象类,无法创建对象
- 子类继承抽象类后,必须实现所有抽象方法,否则子类也无法实例化
- 抽象类可以包含普通方法(已实现的方法)
二、基础使用示例
1. 定义抽象类
python
# 导入必需的模块和装饰器
from abc import ABC, abstractmethod
# 继承 ABC 成为抽象类
class Shape(ABC):
# 抽象方法:只有声明,没有实现
@abstractmethod
def area(self):
pass
# 普通方法:可以直接实现,子类可直接使用
def info(self):
print("我是一个图形")
2. 错误演示:直接实例化抽象类
python
# 报错!抽象类不能创建对象
s = Shape()
报错信息:TypeError: Can't instantiate abstract class Shape with abstract method area
3. 正确用法:子类继承并实现抽象方法
python
# 圆形子类
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
# 必须实现父类的抽象方法
def area(self):
return 3.14 * self.radius ** 2
# 正方形子类
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side ** 2
# 创建子类对象(正常运行)
c = Circle(5)
s = Square(4)
print(c.area()) # 输出:78.5
print(s.area()) # 输出:16
c.info() # 调用抽象类的普通方法:我是一个图形
三、强制约束:不实现抽象方法会报错
如果子类继承了抽象类,但没有实现抽象方法,子类也会变成抽象类,无法实例化:
python
class Triangle(Shape):
pass
# 报错!子类未实现抽象方法 area()
t = Triangle()
四、进阶:抽象类 + 属性抽象
除了方法,还可以定义抽象属性,强制子类必须定义该属性:
python
from abc import ABC, abstractmethod
class Animal(ABC):
# 抽象属性
@property
@abstractmethod
def name(self):
pass
@abstractmethod
def speak(self):
pass
class Dog(Animal):
# 实现抽象属性
name = "小狗"
def speak(self):
print("汪汪汪!")
dog = Dog()
print(dog.name) # 输出:小狗
dog.speak() # 输出:汪汪汪!
五、抽象类的使用场景
- 统一接口规范:多个子类功能相似,必须实现相同的方法(如:支付接口、图形计算、文件解析)
- 代码约束:防止子类遗漏关键方法,降低团队开发的出错率
- 多态实现:通过抽象类统一调用不同子类的方法,提高代码扩展性
总结
- 抽象类 = 继承
ABC+ 包含@abstractmethod方法 - 抽象类不能实例化(至少有一个抽象方法的抽象类),仅作为模板使用
- 子类必须实现所有抽象方法,否则无法使用
- 核心价值:强制规范、统一接口、提高代码可维护性