Python Enum小结

前言

枚举类是一些具有特殊含义的类,比如用一个类表示月份,则该类的实例对象最多有 12 个,一周则有7个对象,Python 3.4 中新增加了 Enum 枚举类,对于这些实例化对象个数固定的类,可以用枚举类来定义。

枚举类定义

  • 只需要令其继承自 enum 模块中的 Enum 类,则证明这是一个枚举类
  • 枚举类的每个成员都由 2 部分组成,分别为 name 和 value
  • name不允许重复,value允许重复
  • 和普通类的用法不同,枚举类不能用来实例化对象
  • 枚举类中各个成员的值,不能在类的外部做任何修改

创建方式1:

1
2
3
4
5
6
7
8
9
10
from enum import Enum
Colors = Enum("Colors",('red','green','blue'))
# 未指定值,默认从 1 开始递增
print(Colors.red.value)
print(Colors.green.value)
print(Colors.blue.value)
### 运行结果
1
2
3

创建方式2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from enum import Enum
class Color(Enum):
red = 1
green = 2
blue = 3

print(Color.red)
print(Color['red'])
print(Color(1))

print(Color.red.value)
print(Color.red.name)

for color in Color:
print(color)
### 运行结果
Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue

使用方式1:正常使用

1
2
3
4
5
print(Color.red==Color.green)
print(Color.red.name is Color.green.name)
### 运行结果
False
False

2:不能在类的外部做任何修改,下面语法的做法是错误的:

1
2
3
4
Color.red = 4
报错:
raise AttributeError('Cannot reassign members.')
AttributeError: Cannot reassign members.

3:枚举类中各个成员必须保证 name 互不相同,但 value 可以相同,举个例子:

1
2
3
4
5
6
7
8
from enum import Enum
class Color(Enum):
red=1
green=1
blue=3
print(Color['green'])
### 运行结果
Color.red

可以看到,Color 枚举类中 red 和 green 具有相同的值(都是 1),Python 允许这种情况的发生,它会将 green 当做是 red 的别名,因此当访问 green 成员时,最终输出的是 red。

4:设置value唯一性,不允许出现相同的value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#引入 unique
from enum import Enum,unique
#添加 unique 装饰器
@unique
class Color(Enum):
# 为序列值指定value值
red = 1
green = 1
blue = 3
print(Color['green'])

### 运行结果报错:
Traceback (most recent call last):
File "test.py", line 3, in <module>
class Color(Enum):
File "/python3.6/lib/enum.py", line 834, in unique
(enumeration, alias_details))
ValueError: duplicate values found in <enum 'Color'>: green -> red

Python Enum小结
https://skynetboys.github.io/2022/08/14/Python-Enum小结/
Author
Edison
Posted on
August 14, 2022
Licensed under