# Python 抽象类(Abstract Class)

Python 中的抽象类 是一种不能直接实例化 的特殊类,它的核心作用是定义子类必须实现的方法规范,强制子类遵循统一的接口设计。

简单说:抽象类就是「模板」,只规定子类要做什么,不负责具体实现,必须由子类继承并实现它的抽象方法后才能使用。


一、核心知识点

  1. 依赖模块 :Python 内置 abc 模块(Abstract Base Classes)实现抽象类
  2. 关键装饰器
    • @abstractmethod:标记抽象方法 ,子类必须重写实现
  3. 规则
    • 包含抽象方法的类 = 抽象类,无法创建对象
    • 子类继承抽象类后,必须实现所有抽象方法,否则子类也无法实例化
    • 抽象类可以包含普通方法(已实现的方法)

二、基础使用示例

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()      # 输出:汪汪汪!

五、抽象类的使用场景

  1. 统一接口规范:多个子类功能相似,必须实现相同的方法(如:支付接口、图形计算、文件解析)
  2. 代码约束:防止子类遗漏关键方法,降低团队开发的出错率
  3. 多态实现:通过抽象类统一调用不同子类的方法,提高代码扩展性

总结

  1. 抽象类 = 继承 ABC + 包含 @abstractmethod 方法
  2. 抽象类不能实例化(至少有一个抽象方法的抽象类),仅作为模板使用
  3. 子类必须实现所有抽象方法,否则无法使用
  4. 核心价值:强制规范、统一接口、提高代码可维护性
相关推荐
阿正的梦工坊2 小时前
JavaScript 微任务与宏任务完全指南
开发语言·javascript·ecmascript
2301_816660212 小时前
PHP怎么处理Eloquent Attribute Inference属性推断_Laravel从数据自动推导类型【操作】
jvm·数据库·python
第一程序员2 小时前
数据工程 pipelines 实践
python·github
知行合一。。。3 小时前
Python--05--面向对象(属性,方法)
android·开发语言·python
郝学胜-神的一滴3 小时前
深度学习必学:PyTorch 神经网络参数初始化全攻略(原理 + 代码 + 选择指南)
人工智能·pytorch·python·深度学习·神经网络·机器学习
青梅橘子皮3 小时前
C语言---指针的应用以及一些面试题
c语言·开发语言·算法
qq_372154233 小时前
Go 中自定义类型与基础类型的显式转换规则详解
jvm·数据库·python
浅时光_c3 小时前
3 shell脚本编程
linux·开发语言·bash
Evand J3 小时前
【三维轨迹目标定位,CKF+RTS,MATLAB程序】基于CKF与RTS平滑的三维非线性目标跟踪(距离+方位角+俯仰角)
开发语言·matlab·目标跟踪
LiAo_1996_Y4 小时前
CSS如何实现文字渐变效果_通过background-clip实现艺术字
jvm·数据库·python