枚举(Enum)跟整型一样,是一种数据类型。它是一系列常量的集合,通常用于表示某些特定的有限集合,如月份、星期、状态、性别(男、女、不男不女)等,当一个变量有几种可能取值的时候,定义为枚举类型。
21.1 枚举定义
枚举是不可变类型,一旦定义创建,其成员的值不可改变,名称不可重复,通过class关键字和继承Enum类进行定义。定义时若出现成员的值相同,那只有第一个有效,其语法结构为:
class 枚举名(Enum):
成员名1 = 值1
成员名x = 值n
# ---引入枚举类---
fromenum importEnum
classColors(Enum):
red = 1
orange = 2
yellow = 3
green = 4
red_alias = 1
print(Colors(1))
21.2 整型枚举
枚举成员的值支持多种数据类型,如字符串、布尔或整型等,如要指定为整型,可继承IntEnum类。注意,就算指定为IntEnum,其成员的值照样可以为字符串等,但在获取成员的值时,会进行自动转换,如果转换失败,会报错。当然,既然指定为整型了,就不要故意指定为字符串等了。
# ---引入枚举类---
fromenum importEnum, IntEnum
#字符串枚举
classGender(Enum):
Male = "男"
Female = "女"
Unknown = "保密"
print(Gender.Male.value)
#整型枚举classNumber(IntEnum):
One = 1
Two = 2
#会自动转为整型
Three = "3"
print(Number.Three.value)
21.3 唯一值
如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique进行限制。如若出现相同值,运行时会报错。
#引入枚举类和唯一装饰器
fromenum importEnum, unique
@unique
classWeekday(Enum):
Sun = 0
Mon = 1
Tue = 2
Wed = 3
Thu = 4Fri = 5
Sat = 6
print(Weekday.Sat.value)
21.4 枚举取值
枚举可通过成员获取它的名称和值,可通过名称或值获取成员。
#引入枚举类和唯一装饰器fromenum importEnum, unique
@uniqueclassMonths(Enum):
Jan = 1
Feb = 2
Mar = 3
Apr = 4
May = 5
Jun = 6
Jul = 7
Aug = 8
Sep = 9
Oct = 10
Nov = 11
Dec = 12
#通过成员获取名称和值print(Months.Jan.name, Months.Jan.value)
#通过名称和值获取成员
print(Months["Feb"], Months(2))
21.5 枚举遍历
通过for循环遍历枚举成员时,如若出现成员的值相同时,只获取第一个成员。当然,如果要遍历所有成员的话,得用特殊的方式获取,就是通过__menbers__属性。
# ---引入枚举类---
fromenum importEnum
classColors(Enum):
red = 1
orange = 2
yellow = 3
green = 4red_alias = 1
#获取成员名称,值相等的,只获取第一个forcolor inColors:print(color.name)
#获取所有成员名称forcolor inColors.__members__:
print(color)
21.6 枚举比较
枚举成员不可以比较大小,但可以通过is、is not 和==、!=进行同性或等值比较。
# ---引入枚举类---
fromenum importEnum
classColors(Enum):
red = 1
orange = 2
yellow = 3
green = 4red_alias = 1
# is判断result = Colors.red isColors.red
print(result)
# is not判断
result = Colors.red is notColors.green
print(result)
# ==比较值是否相等
result = Colors.red == Colors.red_alias
print(result)
# !=比较值是否不相等
result = Colors.red != Colors.green
print(result)
21.7 类中枚举
枚举可以定义在类里,并可通过类名和枚举名进行调用。
# ---引入枚举类---
fromenum importEnum
classPlane:
def__init__(self, color):
self.color = color
#类的成员
classColors(Enum):
Red = 1
Orange = 2
Yellow = 3
Green = 4
Blue = 5
plane = Plane(Plane.Colors.Blue.value)print(plane.color)