python 3.x 枚举

枚举Enumerate

  • 枚举用来表示不同类型
  • 枚举的本质是类
  • 如果想让类称为枚举类型的话,该类需要继承Enum

 

枚举类和普通类相比的优势:

  1. 枚举类型值不能被二次赋值
  2. 枚举类型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)

 

枚举的比较运算 :

  1. 两个枚举类型之间可以进行等值比较 如: VIP.YELLOW == VIP.GREEN
    • 枚举之间的等值比较,不仅仅比较值是否相等,而且判断在内存空间地址值是否相等.
  2. 两个枚举类型之间不可以进行大小比较 如: VIP.YELLOW > VIP.GREEN 报错
  3. 两个枚举类型之间可以进行身份比较 如 : 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)    收藏  举报

导航