使用枚举类
1. 为何用枚举
- 定义常量时,用大写变量 + 整数(如
JAN=1, FEB=2)简单,但类型仍是 int,且仍是普通变量。 - 更好的方式:用 枚举类,每个常量是类的一个唯一实例;Python 提供
Enum实现。
2. 用 Enum 创建枚举(函数式)
Enum('类名', (成员名1, 成员名2, ...)):创建枚举类;成员 value 自动为 int,默认从 1 开始。
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
Month.Jan # 引用常量
Month.Jan.value # 1
- 遍历所有成员:
类名.__members__.items(),每个 member 有.name、.value。
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
3. 自定义枚举类(继承 Enum )
- 需要精确控制 value 时,从
Enum派生,在类中显式指定每个成员的 value。 @unique装饰器:保证没有重复的 value。
from enum import Enum, unique
@unique
class Weekday(Enum):
Sun = 0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
4. 访问枚举的方式
| 方式 | 示例 |
|---|---|
| 成员名 | Weekday.Mon、Weekday['Tue'] |
| value | Weekday.Tue.value → 2 |
| 按 value 取枚举 | Weekday(1) → Weekday.Mon;无效 value 如 Weekday(7) 会 ValueError |
| 比较 | day1 == Weekday.Mon、day1 == Weekday(1) |
| 遍历 | for name, member in Weekday.__members__.items(): |
day1 = Weekday.Mon
print(day1) # Weekday.Mon
print(Weekday(1)) # Weekday.Mon
print(day1 == Weekday(1)) # True
# Weekday(7) # ValueError: 7 is not a valid Weekday
小结
- Enum 把一组相关常量定义在一个 class 中;class 不可变,成员可直接比较(
==)。 - 既可用成员名引用,也可用 value 通过
类名(value)得到枚举成员。
| 要点 | 说明 |
|---|---|
| 创建 | Enum('名', (成员...)) 或 class X(Enum): 成员=value |
| value | 函数式默认从 1 开始;自定义类中显式指定;@unique 防重复 |
| 访问 | 类.成员、类['成员']、类(value)、成员.value |
| 特点 | 常量归类、不可变、成员可 == 比较 |
记忆:常量用 Enum;要控值就继承 Enum + @unique;按名用 类.成员,按值用 类(value)。
练习:把 Student 的 gender 改为枚举类型,避免用字符串;定义 class Gender(Enum): Male=0, Female=1,构造时传 Gender.Male,比较用 bart.gender == Gender.Male。
from enum import Enum, unique
@unique
class Gender(Enum):
Male = 0
Female = 1
class Student(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
bart = Student('Bart', Gender.Male)
bart.gender == Gender.Male # True