跳到主要内容

使用枚举类

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.MonWeekday['Tue']
valueWeekday.Tue.value → 2
按 value 取枚举Weekday(1) → Weekday.Mon;无效 value 如 Weekday(7)ValueError
比较day1 == Weekday.Monday1 == 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)。

练习:把 Studentgender 改为枚举类型,避免用字符串;定义 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