Python3之使用枚举类
当我们需要定义常量时,一个方法是用大写变量通过整数来定义,例如月份
1 2 3 4 5 6 7 8 9 10 11 12 | JAN = 1 FEB = 2 MAR = 3 APR = 4 May = 5 Jun = 6 Jul = 7 Aug = 8 Sep = 9 Oct = 10 NOV = 11 DEC = 12 |
好处是简单,缺点是类型int,并且仍然是变量。
更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python提供了Enum类来实现这个功能:
1 2 | from enum import Enum Month = Enum( 'Month' , ( 'Jan' , 'Feb' , 'Mar' , 'Apr' , 'May' , 'Jun' , 'Jul' , 'Aug' , 'Sep' , 'Oct' , 'Nov' , 'Dec' )) |
这样我们就获得了Month类型的枚举类,可以直接使用Month.Jan来引用一个常量,或者枚举它所有成员
1 2 3 4 | >>> Month.Jan <Month.Jan: 1 > >>> Month.Feb <Month.Feb: 2 > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | >>> for name,member in Month.__members__.items(): ... print (name, '=>' ,member, ',' ,member.value) ... Jan = > Month.Jan , 1 Feb = > Month.Feb , 2 Mar = > Month.Mar , 3 Apr = > Month.Apr , 4 May = > Month.May , 5 Jun = > Month.Jun , 6 Jul = > Month.Jul , 7 Aug = > Month.Aug , 8 Sep = > Month.Sep , 9 Oct = > Month. Oct , 10 Nov = > Month.Nov , 11 Dec = > Month.Dec , 12 |
value属性则是自动赋给成员的int常量,默认从1开始计数
如果需要更精确地控制枚举类型,可以从Enum派生出自定义类
1 2 3 4 5 6 7 8 9 10 | from enum import Enum,unique @unique class Weekday(Enum): Sun = 0 Mon = 1 Tue = 2 Wed = 3 Thu = 4 Fri = 5 Sat = 6 |
装饰器unique保证没有重复
访问这些枚举值有多种方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | >>> day1 = Weekday.Mon >>> print (day1) Weekday.Mon >>> print (Weekday.Tue) Weekday.Tue >>> print (Weekday[ 'Tue' ]) Weekday.Tue >>> print (Weekday.Tue.value) 2 >>> print (day1 = = Weekday.Mon) True >>> print (day1 = = Weekday.Tue) False >>> print (Weekday( 1 )) Weekday.Mon >>> print (day1 = = Weekday( 1 )) True >>> Weekday( 7 ) Traceback (most recent call last): ... ValueError: 7 is not a valid Weekday >>> for name, member in Weekday.__members__.items(): ... print (name, '=>' , member) ... Sun = > Weekday.Sun Mon = > Weekday.Mon Tue = > Weekday.Tue Wed = > Weekday.Wed Thu = > Weekday.Thu Fri = > Weekday.Fri Sat = > Weekday.Sat |
可见,既可以用成员名称引用枚举常量,又可以直接根据value的值获得枚举常量。
练习
把Student的gender属性改为枚举类型,可以避免使用字符串
1 2 3 4 5 6 7 8 9 10 | from enum import Enum, unique class Gender(Enum): Male = 0 Female = 1 class Student( object ): def __init__( self , name, gender): self .name = name self .gender = gender bart = Student( 'Bart' ,Gender.Male) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2018-07-02 Linux查看及设置系统字符集