Python枚举类Enum超详细入门与进阶全攻略
一、什么是枚举(Enum)?
Enum
(枚举),是用于表示一组有名称的常量类型。每个枚举成员都由唯一的名字和值组成,Python从3.4版本开始加入了标准库enum
模块。
枚举优点:
- 可读性强,表达清晰
- 防止魔法数字、常量重复
- 程序更安全、更自解释
- 可与类型提示、IDE轻松集成
二、Enum 最简用法入门
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. 自动赋值
from enum import auto, Enum
class Weekday(Enum):
MONDAY = auto()
TUESDAY = auto()
WEDNESDAY = auto()
auto会自动赋值,省去手动编号烦恼!
2. 保证唯一性
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. 添加方法和属性
你还可以给枚举添加方法或属性,实现更强大功能:
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
支持排序,可以比较大小
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 示例
from enum import IntEnum
class Level(IntEnum):
LOW = 0
MED = 1
HIGH = 2
print(Level.LOW < Level.HIGH) # True
Flag示例(位操作)
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
perm = Permission.READ | Permission.WRITE
print(perm) # Permission.READ|WRITE
五、枚举的遍历与转换
遍历所有成员
for day in Weekday:
print(day, day.value)
# 输出 Weekday.MONDAY 1 ... 等
由值获取(反差)
day = Weekday(1) # 获取Weekday.MONDAY
如果你喜欢这篇文章,欢迎点赞、收藏和转发,更多Python干货内容敬请关注!