news 2026/6/14 6:04:45

8.7 枚举

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
8.7 枚举

文章目录

  • 前言
  • 一、枚举简介
    • 1.1 什么是枚举?
    • 1.2 枚举的发展历程
    • 1.3 为什么需要枚举?
    • 1.4 使用枚举的优势
  • 二、枚举的基本使用
    • 2.1 创建枚举
    • 2.2 访问枚举成员
    • 2.3 枚举成员比较
    • 2.4 确保枚举值唯一

前言

本文主要介绍枚举的基础知识以及枚举的使用方法。


一、枚举简介

1.1 什么是枚举?

枚举是一种特殊的数据类型,用于定义一组具有唯一名称的常量值。枚举中的每个成员都是唯一且不可变的,这使得它们非常适合表示固定的选项集合、状态码、错误代码等。
枚举的特点:

  1. 唯一性:枚举成员名称和值都是唯一的(可通过装饰器保证)
  2. 不可变性:枚举成员创建后不能修改
  3. 可迭代性:可以像集合一样遍历所有成员
  4. 可比较性:支持恒等比较(is)和值比较(==)

1.2 枚举的发展历程

• Python 3.4 之前:没有内置的枚举类型,需要通过第三方库或自定义类实现
• Python 3.4:引入了 enum 模块,添加了 Enum 类
• Python 3.4 之前的版本可以通过 pip install enum34 安装兼容库

1.3 为什么需要枚举?

不使用枚举的传统方式:

python# 使用大写变量定义常量(传统方式)RED=0GREEN=1BLUE=2BLACK=3WHITE=4defset_color(color_code):ifcolor_code==RED:print("设置为红色")elifcolor_code==GREEN:print("设置为绿色")# ...# 问题:这些"常量"实际上还是变量,可以被修改RED=999# 这会导致程序出错,但Python不会阻止

1.4 使用枚举的优势

• 提供类型安全,防止意外的值修改
• 提高代码可读性和可维护性
• 自动文档化,IDE可以提供更好的代码补全
• 防止无效值的使用

二、枚举的基本使用

2.1 创建枚举

基本枚举创建

pythonfromenumimportEnum# 方式1:使用类继承 EnumclassColor(Enum):"""颜色枚举"""RED=1GREEN=2BLUE=3YELLOW=4BLACK=5WHITE=6# 方式2:使用函数式APIWeekday=Enum('Weekday',['MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY','SATURDAY','SUNDAY'])# 方式3:使用函数式API并指定值HTTPStatus=Enum('HTTPStatus',[('OK',200),('CREATED',201),('ACCEPTED',202),('BAD_REQUEST',400),('UNAUTHORIZED',401),('FORBIDDEN',403),('NOT_FOUND',404),('INTERNAL_SERVER_ERROR',500)])# 方式4:使用range自动生成值Priority=Enum('Priority',['LOW','MEDIUM','HIGH'],start=1)print("枚举创建演示:")print("-"*50)print(f"颜色枚举:{list(Color)}")print(f"星期枚举:{list(Weekday)}")print(f"HTTP状态枚举:{list(HTTPStatus)}")print(f"优先级枚举:{list(Priority)}")带有方法的枚举 pythonfromenumimportEnumimportmathclassShape(Enum):"""图形枚举,带有计算面积的方法"""CIRCLE=1SQUARE=2TRIANGLE=3RECTANGLE=4defarea(self,*args):"""计算面积"""ifself==Shape.CIRCLE:radius=args[0]returnmath.pi*radius**2elifself==Shape.SQUARE:side=args[0]returnside**2elifself==Shape.TRIANGLE:base,height=argsreturn0.5*base*heightelifself==Shape.RECTANGLE:length,width=argsreturnlength*widthelse:raiseValueError(f"不支持的图形类型:{self}")# 使用示例print("\n带有方法的枚举:")print("-"*50)print(f"圆形面积 (半径=5):{Shape.CIRCLE.area(5):.2f}")print(f"正方形面积 (边长=4):{Shape.SQUARE.area(4)}")print(f"三角形面积 (底=6, 高=3):{Shape.TRIANGLE.area(6,3)}")print(f"矩形面积 (长=8, 宽=5):{Shape.RECTANGLE.area(8,5)}")

2.2 访问枚举成员

pythonfromenumimportEnumclassStatus(Enum):"""状态枚举"""PENDING='pending'PROCESSING='processing'COMPLETED='completed'FAILED='failed'print("枚举成员访问演示:")print("="*50)# 1. 通过名称访问print("1. 通过名称访问:")print(f"Status.PENDING ={Status.PENDING}")print(f"类型:{type(Status.PENDING)}")# <enum 'Status'># 2. 通过值访问print("\n2. 通过值访问:")print(f"Status('pending') ={Status('pending')}")print(f"Status['PENDING'] ={Status['PENDING']}")# 3. 访问成员属性print("\n3. 访问成员属性:")member=Status.PENDINGprint(f"成员:{member}")print(f"名称(name):{member.name}")print(f"值(value):{member.value}")print(f"类型:{type(member)}")# 4. 检查成员存在性print("\n4. 检查成员存在性:")print(f"'PENDING' in Status.__members__:{'PENDING'inStatus.__members__}")print(f"'CANCELLED' in Status.__members__:{'CANCELLED'inStatus.__members__}")print(f"'pending' 是否是有效值:{'pending'in[s.valueforsinStatus]}")# 5. 获取所有成员print("\n5. 获取所有成员:")print(f"Status.__members__:{Status.__members__}")print(f"list(Status):{list(Status)}")print(f"len(Status):{len(Status)}")# 6. 遍历枚举print("\n6. 遍历枚举成员:")print("直接遍历:")forstatusinStatus:print(f"{status.name:12}={status.value}")print("\n遍历名称和值:")forname,memberinStatus.__members__.items():print(f"{name:12}={member.value}")

2.3 枚举成员比较

pythonfromenumimportEnumclassLogLevel(Enum):"""日志级别枚举"""DEBUG=10INFO=20WARNING=30ERROR=40CRITICAL=50print("枚举成员比较演示:")print("="*50)# 创建一些枚举实例debug1=LogLevel.DEBUG debug2=LogLevel.DEBUG info=LogLevel.INFOprint("1. 恒等比较 (is):")print(f" debug1 is debug2:{debug1isdebug2}")# True - 同一个对象print(f" debug1 is info:{debug1isinfo}")# False - 不同对象print("\n2. 相等比较 (==):")print(f" debug1 == debug2:{debug1==debug2}")# True - 值相同print(f" debug1 == info:{debug1==info}")# False - 值不同print(f" LogLevel.DEBUG == LogLevel(10):{LogLevel.DEBUG==LogLevel(10)}")# Trueprint("\n3. 值比较:")print(f" debug1.value == 10:{debug1.value==10}")# Trueprint(f" debug1.value == info.value:{debug1.value==info.value}")# Falseprint("\n4. 名称比较:")print(f" debug1.name == 'DEBUG':{debug1.name=='DEBUG'}")# Trueprint(f" debug1.name == info.name:{debug1.name==info.name}")# Falseprint("\n5. 身份比较:")print(f" id(debug1) == id(debug2):{id(debug1)==id(debug2)}")# True# 注意:枚举成员不支持大小比较(除非使用IntEnum)print("\n6. 大小比较(会报错):")try:result=LogLevel.DEBUG<LogLevel.INFOprint(f" DEBUG < INFO:{result}")exceptTypeErrorase:print(f" 错误:{e}")

2.4 确保枚举值唯一

pythonfromenumimportEnum,uniqueprint("确保枚举值唯一演示:")print("="*50)# 1. 没有 @unique 装饰器的情况(允许重复值)classDuplicateColor(Enum):"""没有唯一性检查的枚举"""RED=1GREEN=2BLUE=3LIGHT_RED=1# 值与RED重复,但这是允许的print("1. 没有 @unique 装饰器:")print(f" RED:{DuplicateColor.RED}")print(f" LIGHT_RED:{DuplicateColor.LIGHT_RED}")print(f" RED == LIGHT_RED:{DuplicateColor.RED==DuplicateColor.LIGHT_RED}")# Trueprint(f" RED is LIGHT_RED:{DuplicateColor.REDisDuplicateColor.LIGHT_RED}")# Trueprint(f" 注意: RED 和 LIGHT_RED 是同一个对象!")# 2. 使用 @unique 装饰器try:@uniqueclassUniqueColor(Enum):"""有唯一性检查的枚举"""RED=1GREEN=2BLUE=3LIGHT_RED=1# 这里会引发 ValueErrorprint("\n2. 使用 @unique 装饰器:")print(" 代码不会执行到这里,因为上面已经报错了")exceptValueErrorase:print(f"\n2. 使用 @unique 装饰器(捕获错误):")print(f" 错误:{e}")# 3. 正确的唯一枚举@uniqueclassProperColor(Enum):"""正确的唯一枚举"""RED=1GREEN=2BLUE=3YELLOW=4BLACK=5WHITE=6print("\n3. 正确的唯一枚举:")forcolorinProperColor:print(f"{color.name:10}={color.value}")# 4. 自动生成唯一值@uniqueclassAutoNumber(Enum):"""使用自动赋值确保唯一性"""FIRST=1SECOND=2THIRD=3FOURTH=4# 如果有很多成员,可以使用自动赋值# 但需要小心确保唯一性print("\n4. 枚举值唯一性的重要性:")print(" 在实际项目中,枚举值唯一性很重要,因为:")print(" - 避免逻辑错误")print(" - 提高代码可读性")print(" - 便于调试和维护")print(" - 防止意外的值冲突")

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 23:20:18

8.8 迭代器

文章目录前言一、迭代与可迭代对象1.1 什么是迭代&#xff1f;1.2 可迭代对象1.3 自定义可迭代对象二、迭代器2.1 什么是迭代器&#xff1f;前言 本文主要介绍了迭代与可迭代对象以及迭代器的基础知识。 一、迭代与可迭代对象 1.1 什么是迭代&#xff1f; 迭代是指通过重复执…

作者头像 李华
网站建设 2026/6/10 17:42:59

VoxCPM-1.5-TTS-WEB-UI与网盘直链下载助手无关联说明

VoxCPM-1.5-TTS-WEB-UI 与网盘直链下载助手无关联说明 在人工智能语音技术飞速发展的今天&#xff0c;越来越多的研究者和开发者开始尝试将高质量的文本转语音&#xff08;TTS&#xff09;能力集成到实际应用中。从有声书生成、虚拟主播驱动&#xff0c;到智能客服系统构建&…

作者头像 李华
网站建设 2026/6/14 4:45:58

VoxCPM-1.5-TTS-WEB-UI语音模型开源协议说明及商用可行性分析

VoxCPM-1.5-TTS-WEB-UI语音模型开源协议说明及商用可行性分析 在智能语音技术加速落地的今天&#xff0c;越来越多企业开始关注如何以低成本、高效率的方式构建自有语音能力。尤其是在有声内容爆发、虚拟人兴起、无障碍服务普及的大背景下&#xff0c;文本转语音&#xff08;TT…

作者头像 李华
网站建设 2026/6/10 19:02:33

一文说清AD原理图如何无缝生成PCB板图

从原理图到PCB&#xff1a;如何在Altium Designer中实现真正“无缝”衔接你有没有遇到过这样的场景&#xff1f;花了整整三天画完一张复杂的STM32主控板原理图&#xff0c;信心满满地点击“Update PCB”&#xff0c;结果弹出一堆红色报错&#xff1a;“Footprint not found”、…

作者头像 李华
网站建设 2026/6/10 16:13:59

GLPI开源项目终极贡献指南:开发者快速成长路径

GLPI开源项目终极贡献指南&#xff1a;开发者快速成长路径 【免费下载链接】glpi glpi-project/glpi: 是一个用于管理 IT 资产和服务的 PHP 应用程序。适合用于 IT 资产管理和服务管理。特点是提供了简单的 API&#xff0c;支持多种 IT 资产和服务管理功能&#xff0c;并且可以…

作者头像 李华
网站建设 2026/6/13 17:06:48

从零实现Elasticsearch内存监控:手把手搭建资源观测体系

看得清&#xff0c;才能管得住&#xff1a;手把手构建 Elasticsearch 内存监控体系 你有没有遇到过这样的场景&#xff1f; 凌晨三点&#xff0c;告警突然炸响——某个 Elasticsearch 节点 OOM 退出集群。你匆忙登录系统&#xff0c;发现堆内存使用率早已突破 95%&#xff0c…

作者头像 李华