python 3.x 枚举
枚举Enumerate
- 枚举用来表示不同类型
- 枚举的本质是类
- 如果想让类称为枚举类型的话,该类需要继承Enum
枚举类和普通类相比的优势:
- 枚举类型值不能被二次赋值
- 枚举类型key不能重复
1 from enum import Enum 2 3 4 class VIP(Enum): 5 YELLOW = 1 6 GREEN = 2 7 BLACK = 3 8 RED = 4 9 10 11 # 输出结果: VIP.YELLOW,而不是值1 12 # 通常关注枚举的名字,名字相对而言是有意义的 13 print(VIP.YELLOW) 14 print(type(VIP.YELLOW)) # <enum 'VIP'> 15 16 # 获取枚举标签所对应的值 1 17 print(VIP.YELLOW.value) 18 print(type(VIP.YELLOW.value)) # <class 'int'> 19 20 # 获取枚举下面标签的名字 YELLOW 21 print(VIP.YELLOW.name) 22 print(type(VIP.YELLOW.name)) # <class 'str'> 23 24 print(VIP["YELLOW"]) # VIP.YELLOW 25 26 # 枚举可以被遍历 27 # 输出结果: 28 # VIP.YELLOW 29 # VIP.GREEN 30 # VIP.BLACK 31 # VIP.RED 32 for v in VIP: 33 print(v)
枚举的比较运算 :
- 两个枚举类型之间可以进行等值比较 如: VIP.YELLOW == VIP.GREEN
-
枚举之间的等值比较,不仅仅比较值是否相等,而且判断在内存空间地址值是否相等.
-
- 两个枚举类型之间不可以进行大小比较 如: VIP.YELLOW > VIP.GREEN 报错
- 两个枚举类型之间可以进行身份比较 如 : VIP.YELLOW is VIP.GREEN
1 from enum import Enum 2 3 4 class VIP(Enum): 5 YELLOW = 1 6 GREEN = 2 7 BLACK = 3 8 RED = 4 9 10 11 class VIP1(Enum): 12 YELLOW = 1 13 GREEN = 2 14 BLACK = 3 15 RED = 4 16 17 18 # 枚举之间等值比较 19 print(VIP.YELLOW == VIP.BLACK) # False 20 print(VIP.YELLOW == VIP.YELLOW) # True 21 print(VIP.YELLOW == 1) # False 22 23 # 枚举之间身份比较 24 print(VIP.YELLOW is VIP.GREEN) # False 25 print(VIP.YELLOW is VIP.YELLOW) # True 26 27 # 两个枚举类中的成员进行比较 28 # 枚举之间的等值比较,不仅仅比较值是否相等,而且判断在内存空间地址值是否相等. 29 print(VIP.YELLOW == VIP1.YELLOW) # False
枚举注意事项
- 枚举不能实例化,因为枚举是用单例模式来实现的
- 枚举类中的成员名key不能重复,否则报错.
- 枚举类中的成员取值value可以相同,但是除第一个外,剩下都是第一个成员名的别名
1 from enum import Enum 2 3 4 class VIP(Enum): 5 YELLOW = 1 6 GREEN = 1 7 BLACK = 3 8 RED = 4 9 BLUE = 1 10 11 12 # GREEN就是YELLOW的别名 13 print(VIP.GREEN) # 输出结果是VIP.YELLOW而不是VIP.GREEN 14 print(VIP.BLUE) # VIP.YELLOW 15 16 # 枚举类中的成员有三个取值相同,此时在遍历一次枚举VIP 17 # 输出结果: 第一个取值1的枚举被打印出来,而其他两个被忽略. 18 # VIP.YELLOW 19 # VIP.BLACK 20 # VIP.RED 21 for v in VIP: 22 print(v) 23 24 # 遍历枚举类VIP所有的成员,包括别名(取值相同的枚举成员) 使用枚举中提供的内置变量,来获取枚举中所有的成员. 25 # 输出结果: 26 # YELLOW 27 # GREEN 28 # BLACK 29 # RED 30 # BLUE 31 for v in VIP.__members__: 32 print(v) 33 34 # 输出结果: 使用VIP___member__.items()遍历枚举,返回结果是元组,第一个时枚举标签的名称,第二个是枚举标签及对应的一个取值. 35 # ('YELLOW', <VIP.YELLOW: 1>) 36 # ('GREEN', <VIP.YELLOW: 1>) 37 # ('BLACK', <VIP.BLACK: 3>) 38 # ('RED', <VIP.RED: 4>) 39 # ('BLUE', <VIP.YELLOW: 1>) 40 for v in VIP.__members__.items(): 41 print(v)
枚举转换
- 枚举类名称(具体数值) 如 VIP(1) --> VIP.YELLOW
1 """ 2 枚举转换 3 在服务器端开发时,少不了与数据库打交道,如果想在数据库中存储枚举值, 4 通常在数据库中存储的是枚举的具体数值,除了在数据库中存取枚举的具体数值用来代表枚举类型之外, 5 还可以选择存储枚举的标签名,把标签的名字以字符串的形式存储到数据库中某一个字段中, 6 用来代表某个枚举类型.建议使用枚举的具体数值,来存储枚举类型.因为数字更加的简洁,并且占用数据库的空间较小 7 8 代码中分类,建议使用枚举标签来分类,便于代码的可读性. 9 """ 10 from enum import Enum 11 12 """ 需求 : 从数据库中获取的分类是具体的数字,将数字转换成代码中对应的枚举类型 """ 13 14 15 class VIP(Enum): 16 YELLOW = 1 17 GREEN = 2 18 BLACK = 3 19 RED = 4 20 BLUE = 5 21 22 23 # 将具体的数字转化成对应的枚举类型 24 # VIP(a)看上去像是强制类型转换,实际上不是,而是对应关系. 25 a = 1 26 print(VIP(a)) # VIP.YELLOW 27 28 b = 5 29 print(VIP(b)) # VIP.BLUE
1 """ 当一个类继承IntEnum类,那么该类下的所有枚举类型都是number类型或者可以强制转换成number类型的数据. 2 枚举类中的具体数值,强制必须是int类型,包括可强转成数值int的类型,使用IntEnum, 3 给枚举标签赋值其他类型具体值,报错 4 """ 5 from enum import IntEnum 6 7 8 class VIP(IntEnum): 9 YELLOW = 1 10 GREEN = 2 11 BLACK = "str" # 报错:ValueError: invalid literal for int() with base 10: 'str' 12 RED = 4 13 BLUE = 5 14 15 16 class VIP1(IntEnum): 17 YELLOW = 1 18 GREEN = 2 19 BLACK = "3" # 不会报错,因为"3"可以被强转转换成int类型 20 RED = 4 21 BLUE = 5
如果想限制每一个不同的枚举类型不能取相同的值的方法:
- 将枚举类class上添加装饰器@unique来检查枚举中是否有赋值相同的枚举类型,有则报错.
1 """ 限制每一个枚举标签,不能取相同的值,否则报错,需要给枚举类添加装饰器@unique """ 2 from enum import Enum, unique 3 4 5 # 不会报错 6 class VIP(Enum): 7 YELLOW = 1 8 GREEN = 1 9 BLACK = 3 10 RED = 4 11 BLUE = 5 12 13 14 # 报错: 15 # ValueError: duplicate values found in <enum 'VIP'>: GREEN -> YELLOW 16 # 在<enum 'VIP'>中发现的重复值:GREEN ->YELLOW 17 @unique 18 class VIP1(Enum): 19 YELLOW = 1 20 GREEN = 1 21 BLACK = 3 22 RED = 4 23 BLUE = 5
********
posted on 2018-07-18 16:51 jaydenjune 阅读(45) 评论(0) 收藏 举报
浙公网安备 33010602011771号