Python枚举类Enum超详细入门与进阶全攻略

一、什么是枚举(Enum)?

Enum(枚举),是用于表示一组有名称的常量类型。每个枚举成员都由唯一的名字和值组成,Python从3.4版本开始加入了标准库enum模块。

枚举优点:

  • 可读性强,表达清晰
  • 防止魔法数字、常量重复
  • 程序更安全、更自解释
  • 可与类型提示、IDE轻松集成

二、Enum 最简用法入门

python 复制代码
from enum import Enum

class Weekday(Enum):
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3

print(Weekday.MONDAY)        # Weekday.MONDAY
print(Weekday.MONDAY.value)  # 1
print(Weekday.MONDAY.name)   # 'MONDAY'

无需担心值重复或非法赋值!


三、高级用法:自动赋值、唯一性与自定义属性

1. 自动赋值

python 复制代码
from enum import auto, Enum

class Weekday(Enum):
    MONDAY = auto()
    TUESDAY = auto()
    WEDNESDAY = auto()

auto会自动赋值,省去手动编号烦恼!

2. 保证唯一性

python 复制代码
from enum import unique,Enum

@unique
class Status(Enum):
    NORMAL = 1
    ERROR = 2
    CANCEL = 3
    PENDING = 1  #duplicate values found in <enum 'Status'>: PENDING -> NORMAL

print(Status.NORMAL)
print(Status.NORMAL.value)
# 如果有重复值会抛出duplicate values

3. 添加方法和属性

你还可以给枚举添加方法或属性,实现更强大功能:

python 复制代码
class VIP(Enum):
    BRONZE = 1
    SILVER = 2
    GOLD = 3

    def level(self):
        return {1: '初级', 2: '中级', 3: '高级'}.get(self.value, '未知')

vip = VIP.GOLD
print(vip.level())   # '高级'

4. 枚举类的比较大小

  • 普通Enum里面的排序是无序的,不支持排序
  • IntEnum支持排序,可以比较大小
python 复制代码
from enum import Enum, IntEnum

class User(IntEnum): # IntEnum 如果改成Enum,下面的sorted就会发生异常
   a = 98
   b = 30
   c = 12

try:
   print('\n'.join('  ' + s.name for s in sorted(User)))
except TypeError as err:
   print(' Error : {}'.format(err))

四、枚举的多种类型小结

  • Enum:最基础的通用枚举
  • IntEnum:值必须是int,兼容大小比较等整型操作
  • Flag / IntFlag:位运算枚举,适合状态组合或权限位

IntEnum 示例

python 复制代码
from enum import IntEnum
class Level(IntEnum):
    LOW = 0
    MED = 1
    HIGH = 2

print(Level.LOW < Level.HIGH)  # True

Flag示例(位操作)

python 复制代码
from enum import Flag, auto
class Permission(Flag):
    READ = auto()
    WRITE = auto()
    EXECUTE = auto()

perm = Permission.READ | Permission.WRITE
print(perm)  # Permission.READ|WRITE

五、枚举的遍历与转换

遍历所有成员

python 复制代码
for day in Weekday:
    print(day, day.value)
# 输出 Weekday.MONDAY 1 ... 等

由值获取(反差)

python 复制代码
day = Weekday(1)    # 获取Weekday.MONDAY

如果你喜欢这篇文章,欢迎点赞、收藏和转发,更多Python干货内容敬请关注!

相关推荐
站大爷IP15 分钟前
Python 办公实战:用 python-docx 自动生成 Word 文档
python
超人不会飛16 分钟前
就着HTTP聊聊SSE的前世今生
前端·javascript·http
蓝胖子的多啦A梦19 分钟前
Vue+element 日期时间组件选择器精确到分钟,禁止选秒的配置
前端·javascript·vue.js·elementui·时间选选择器·样式修改
夏天想22 分钟前
vue2+elementui使用compressorjs压缩上传的图片
前端·javascript·elementui
今晚打老虎z30 分钟前
dotnet-env: .NET 开发者的环境变量加载工具
前端·chrome·.net
用户38022585982435 分钟前
vue3源码解析:diff算法之patchChildren函数分析
前端·vue.js
MO2T41 分钟前
使用 Flask 构建基于 Dify 的企业资金投向与客户分类评估系统
后端·python·语言模型·flask
烛阴41 分钟前
XPath 进阶:掌握高级选择器与路径表达式
前端·javascript
慢热型网友.44 分钟前
用 Docker 构建你的第一个 Python Flask 程序
python·docker·flask
Naiva44 分钟前
【小技巧】Python + PyCharm 小智AI配置MCP接入点使用说明(内测)( PyInstaller打包成 .exe 可执行文件)
开发语言·python·pycharm