一、介绍
枚举类可以方便地表示星期,月份等常数类型,如果你不用枚举类,那么你只能用数字或者字符串。如果你使用数字,用1-7来表示星期数,但一个数字在程序中不仅可以表示星期数,可能还有其他许多含义,这样你在写程序时就必须时刻记住这些数字的含义,这降低了程序的可读性,也导致容易出错。而当你使用字符串时,虽然没有明显的缺点,但在内存中字符串所占内存要比数字多,这就降低了程序的效率。
枚举类正好弥补了这两方面的缺点,你可以在代码中使用枚举类,但在内存中存放时使用的是数字,既提高了可读性,又提高了程序效率。更重要的是,Python中的枚举类型是不可变类型,又可以进行迭代,这就意味着你可以随时使用枚举类型而不用担心改变了枚举类型的值
二、代码
from enum import Enum, unique #@unique #@unique装饰器可以帮助我们检查保证没有重复值 class Weekday(Enum): Sun = 0 # Sun的value被设定为0 Mon = 1 Tue = 2 Wed = 3 Thu = 4 Fri = 5 Sat = 6 Say = 6 #假设重复项 print(Weekday.Sun) #枚举类型 print(Weekday['Sun']) #枚举类型 print(Weekday.Sun.name) #枚举名称 print(Weekday.Sun.value) #枚举值 print(Weekday(3)) #数字得到枚举类型 # 遍历枚举,重复的不会打印 for w in Weekday: print(w) # 遍历枚举,重复的会打印 for name, member in Weekday.__members__.items(): print( name, member )
三、进阶用法
from enum import Enum, unique @unique # @unique装饰器可以帮助我们检查保证没有重复值 class Weekday(Enum): def __new__(cls, english, chinese, day): obj = object.__new__(cls) obj.english = english obj.chinese = chinese obj.day = day return obj Sun = 'Sunday', '星期日', 0 # Sun的value被设定为0 Mon = 'Monday', '星期一', 1 Tue = 'Tuesday', '星期二', 2 Wed = 'Wednesday', '星期三', 3 Thu = 'Thursday', '星期四', 4 Fri = 'Friday', '星期五', 5 Sat = 'Saturday', '星期六', 6 print(Weekday.Sun) # 枚举类型 print(Weekday['Sun']) # 枚举类型 print(Weekday.Sun.name) # 枚举名称 print(Weekday.Sun.value) # 枚举值 print(Weekday.Sun._value_) # 也是枚举值 print(Weekday.Sun.chinese) # 自定义枚举中文名 print(Weekday.Sun.english) # 自定义枚举英文名 print(Weekday( ('Wednesday', '星期三', 3))) # 这里注意,按照源码中最后的判断,if value in cls._value2member_map_: value就是传入的值, # cls._value2member_map_就是包含__value__的一个字典,也就是枚举的3个值,是一个整体的元组 @unique # @unique装饰器可以帮助我们检查保证没有重复值 class Weekday(Enum): def __new__(cls, english, chinese, day): obj = object.__new__(cls) obj.english = english obj.chinese = chinese obj._value_ = day # 稍作修改 return obj Sun = 'Sunday', '星期日', 0 # Sun的value被设定为0 Mon = 'Monday', '星期一', 1 Tue = 'Tuesday', '星期二', 2 Wed = 'Wednesday', '星期三', 3 Thu = 'Thursday', '星期四', 4 Fri = 'Friday', '星期五', 5 Sat = 'Saturday', '星期六', 6 print(Weekday.Sun) # 枚举类型 print(Weekday['Sun']) # 枚举类型 print(Weekday.Sun.name) # 枚举名称 print(Weekday.Sun.value) # 枚举值 print(Weekday.Sun._value_) # 也是枚举值 print(Weekday.Sun.chinese) # 自定义枚举中文名 print(Weekday.Sun.english) # 自定义枚举英文名 print(Weekday(3)) #这样也可以判断了