1、概览
当我们需要定义有规律的常量时,比如月份。我们可以用Enum类来实现这个功能
1.1、直接使用Enum类
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
>>> type(Month)
<class 'enum.EnumMeta'>
定义了一个枚举类型的Month类,其中每个常量都是Month类的一个唯一实例。
# 枚举Month的所有成员
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
Jan => Month.Jan , 1
Feb => Month.Feb , 2
…
参数分析:
name:Month中的每个常量名
member:Month中的每个实例
member.value:value属性则是自动赋给成员的int常量,默认从1开始计数
# 使用
>>> Month.Jan # 直接引用一个常量,比如使用Month.Jan
<Month.Jan: 1>
>>> Month(1) # 通过value值来显示
<Month.Jan: 1>
# 看下Month的内部结构
>>> list(Month) # 我们可以看到,Month内部,每个实例和value组成了键值对
[<Month.Jan: 1>, <Month.Feb: 2>, <Month.Mar: 3>, <Month.Apr: 4>, <Month.May: 5>,
<Month.Jun: 6>, <Month.Jul: 7>, <Month.Aug: 8>, <Month.Sep: 9>, <Month.Oct: 10>
, <Month.Nov: 11>, <Month.Dec: 12>]
注:Month里的键值对是由Enum('Month', ('Jan',…)里的Month,Jane,value,共同组合而成。例如
>>> Gender=Enum('gender',('Male','Female'))
>>> list(Gender)
[<gender.Male: 1>, <gender.Female: 2>]
1.2、从Enum派生出自定义类
如果需要更精确地控制枚举类型,可以从Enum派生出自定义类使用
from enum import Enum, unique
@unique # @unique装饰器可以帮助我们检查保证没有重复值
class Weekday(Enum):
Sun = 0 # 自定义Value值
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
参数分析:
常量名:Sun,Mon,…
实例:Weekday.Sun,Weekday.Mon,…
Value值:0,1,2,…
# Weekday的结构
>>> list(Weekday)
[<Weekday.Sun: 0>, <Weekday.Mon: 1>, <Weekday.Tue: 2>, <Weekday.Wed: 3>, <Weekda
y.Thu: 4>, <Weekday.Fri: 5>, <Weekday.Sat: 6>]
# print(实例) 和 直接使用实例 的区别
>>> print(Weekday.Tue) # print,只显示实例名
Weekday.Tue
>>> Weekday.Tue # 直接使用实例,显示键值对
<Weekday.Tue: 2>
>>> print(Weekday(1))
Weekday.Mon
>>> Weekday(1)
<Weekday.Mon: 1>
1.3、总结
既可以用成员名称引用枚举常量【Month.Jan】,又可以直接根据value的值获得枚举常量【Month(1)】
2、例子
1、把Student的gender属性改造为枚举类型,可以避免使用字符串:
# -*- coding: utf-8 -*-
from enum import Enum, unique
方法一:使用Enum的派生类
class Gender(Enum):
Male = 0
Female = 1
方法二:直接使用Enum
Gender = Enum('Gender', ('Male', 'Female'))
class Student(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
# 测试:
bart = Student('Bart', Gender.Male)
if bart.gender == Gender.Male:
print('测试通过!')
else:
print('测试失败!')
原文地址:http://blog.51cto.com/12758568/2116861