枚举


# 枚举

# 什么是枚举

  • Python 中枚举是一种类,存放在 enum 模块
  • 枚举类型可以给一组标签赋予一组特定的值

# 枚举的特点

  • 枚举类中不能存在相同的标签名
  • 枚举是可迭代的
  • 不同的枚举标签可以对应相同的值,但它们都会被视为该值对应第一个标签的别名
  • 如果要限制定义枚举时,不能定义相同值的成员,可以使用装饰器 @unique(需要导入 unique 模块)
  • 枚举成员之间不能进行大小比较,可进行等值和同一性比较
  • 枚举成员为单例,不可实例化,不可更改

枚举的意义重在标签而不在于数值,最好全部使用大写

# 枚举类

Python 中所有枚举类型都是 enum 模块下的 Enum 类的子类

from enum import Enum
class Color(Enum):
    YELLOW = 1
    GREEN = 2
    BLACK = 3
    RED = 4
1
2
3
4
5
6

如果让标签的值唯一,需要 @unique 装饰器修饰类

from enum import Enum, unique

@unique
class Color(Enum):
    YELLOW = 1
    GREEN = 2
    BLACK = 3
    RED = 4
1
2
3
4
5
6
7
8

# 枚举类型、名称、值获取

获取枚举类型中的数值:class.value 获取枚举类型中的标签:class.name 获取数值的标签:class(value).name

from enum import Enum, unique

class Color(Enum):
    YELLOW = 1
    GREEN = 2
    BLACK = 3
    RED = 4

print(Color.YELLOW.value)
print(Color.YELLOW.name)
print(Color.YELLOW)
print(Color['YELLOW'])
print(Color(1).name)
print(type(Color.YELLOW.value))
print(type(Color.YELLOW.name))
print(type(Color.YELLOW))
print(type(Color['YELLOW']))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

结果:

1                # 枚举的值
YELLOW           # 枚举的标签
Color.YELLOW     # 通过枚举标签获取枚举类型
Color.YELLOW     # 通过枚举标签获取枚举类型
YELLOW           # 通过值获取标签名
<class 'int'>    # 枚举值的值类型
<class 'str'>    # 枚举标签的类型
<enum 'Color'>   # 通过枚举标签获取枚举类型
<enum 'Color'>   # 通过枚举标签获取枚举类型
1
2
3
4
5
6
7
8
9

遍历枚举

使用 for..in..

for color in Color:
    print(color)
1
2

结果:

Color.YELLOW
Color.GREEN
Color.BLACK
Color.RED
1
2
3
4

如果枚举中有标签的值重复时,在遍历时,默认结果中不会显示重复值的标签名

class Color(Enum):
    YELLOW = 1
    GREEN = 2
    BLACK = 3
    RED = 4
    WHITE = 1  
for color in Color:
    print(color)
1
2
3
4
5
6
7
8

结果,没有显示 WHITE 这个标签:

Color.YELLOW
Color.GREEN
Color.BLACK
Color.RED
1
2
3
4

如果想要输出这个重复值的标签时,可以通过迭代__members__来显示所有成员标签

for color in Color.__members__:
    print(color)
1
2

结果:

YELLOW
GREEN
BLACK
RED
WHITE
1
2
3
4
5

枚举的比较运算

  • 枚举类型之间可以进行等值比较,但直接比较会返回 False
print(Color.YELLOW==1)           # False
print(Color.YELLOW.value == 1)   # True
1
2
  • 枚举类型之间不支持大小操作符比较
  • 枚举类型可以进行is比较
print(Color.YELLOW is Color.YELLOW)   # True
1
  • 不同枚举类中的枚举类型进行比较都会返回 False

总结

  • Enum:不限制枚举类型数值的数据类型
  • IntEnum:限制枚举类型数值必须为整型
  • 枚举是单例模式,不能实例化
  • @unique:标签值唯一

(完)