枚举类
在一些情况下,当我们想要表示那些有规律的、有限且固定的对象时,可以使用枚举类;比如月份、星期、四季等;
枚举类一旦被定义,那么枚举类中的对象不允许被外界更改;
在Python中有两种方式定义枚举类:
- 利用enum模块下的Enum函数;
- 通过继承Enum基类来派生出枚举类;
Enum()函数:
from enum import Enum
Season = Enum('Season',('Spring','Summer','Fall','Winter'))
如上,Enum有两个参数,第一个参数指定枚举类的类名,第二个参数为一个元组,用于定义枚举类中的所有成员;
枚举类中的每个成员的都有两个属性:name、value。name是成员名,value是该成员在元组列表中的序号值,序号值默认从1开始;
访问枚举类:
from enum import Enum
Season = Enum('Season',('Spring','Summer','Fall','Winter'))
print(Season.Spring)
print(Season.Spring.name)
print(Season.Spring.value)
print(Season['Fall'])
print(Season(3))
print(Season(3).value)
##
Season.Spring
Spring
1
Season.Fall
Season.Fall
3
注意访问时的前缀是等号左边的Season,不是括号内的;
遍历枚举类:
通过__members__属性可以遍历枚举类。
__members__返回一个dict字典,利用items()方法可以遍历所有键值对;
from enum import Enum
Season = Enum('Season',('Spring','Summer','Fall','Winter'))
for n,v in Season.__members__.items():
print(n,v,sep=":")
##
Spring:1
Summer:2
Fall:3
Winter:4
for n in Season.__members__:
print(n)
##
Spring
Summer
Fall
Winter
for v in Season:
print(v)
##
Season.Spring
Season.Summer
Season.Fall
Season.Winter
派生枚举类:
如果需要定义更复杂的枚举类,可以通过继承Enum来派生枚举类,例如:
from enum import Enum
class Weekday(Enum):
Sun = "星期日"
Mon = "星期一"
Tue = "星期二"
Wed = "星期三"
Thu = "星期四"
Fri = "星期五"
Sat = "星期六"
def info(self):
print("今天是%s!" % self.value)
在这个例子中,我们不仅给枚举类赋予了value,即星期一至星期日,还额外定义了枚举类的方法info();
注意一点,枚举类不允许枚举成员的键相同,即成员标签,但是运行value相同,这和字典很像;当value相同时,后者相当于前者的别名;当存在别名情况时,遍历输出会忽略掉重复项;
print(Weekday.Sun)
print(Weekday.Mon.name)
print(Weekday.Mon.value)
print()
print(Weekday['Wed'].value)
print(Weekday('星期五'))
Weekday.Mon.info()
##
Weekday.Sun
Mon
星期一
星期三
Weekday.Fri
今天是星期一!
当然派生出的类依然可以通过__members__遍历,不再赘述;
装饰器:
枚举类也是类,因此也可以使用装饰器,例如@property,@unique等,不再举例;
部分内容(不限于本文)参考自: