一、什么是枚举:
1.定义枚举要导入enum模块。
2.枚举定义用class关键字,继承Enum类。
用于定义枚举的class和定义类的class是有区别
from enum import Enum class Color(Enum): red = 1 blue = 2 yellow = 3 pink = 4 print(Color.red)
注意:
首先要导入enum模块,注意大小写,class类中,继承Enum类;
枚举出成员,有各自不同的名称和值,一定要不同!!
每个成员的名称是Color.red,Color.blue.....
1.定义枚举时,成员名不允许重复:
from enum import Enum
class Color(Enum): red = 1 red = 2 #提示错误:TypeError: Attempted to reuse key: 'red' 代码不能执行
2.默认状态下,不同成员值允许相同,但是第二个成员被视为第一个成员的别名
from enum import Enum
class Color(Enum): red = 1 red_alias = 1 #red_alias就被视作成员Color.red名称red的别名 ,只获取第一个
print(Color(1)) #Color.red
3.限制定义枚举,导入@unique装饰器后,不能定义相同值的成员
from enum import Enum,unique @unique class Color(Enum): red = 1 red_other = 1 #此处值相同,报错ValueError: duplicate values found in <enum 'Color'>: red_other -> red blue = 2 yellow = 3 pink = 4
二、获取枚举值
2.1 通过成员的名称来获取成员
Color['red']
2.2 通过成员值来获取成员
Color(2)
2.3 通过成员,来获取它的名称和值
red_member = Color.red
red_member.name
red_member.value
三、迭代器
3.1 枚举支持迭代器,可以遍历枚举成员
for c in Color: print(c, end=' ')
# 打印结果 Color.red Color.orange Color.yellow
3.2 如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员
from enum import Enum class Color(Enum): red = 1 red_other = 1 blue = 2 yellow = 3 pink = 4 for c in Color: print(c,end=' ')
# 打印结果 Color.red Color.blue Color.yellow Color.pink 并不会打印red_other
3.3 如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性__members__
注意:__members__和__members__.items()都不会报错,但打印结果略有不同
比较一:__members__.items()
class Color(Enum): red = 1 red_other = 1 blue = 2 yellow = 3 pink = 4 for c in Color.__members__.items(): print(c,end=' ')
# 打印结果 ('red', <Color.red: 1>) ('red_other', <Color.red: 1>) ('blue', <Color.blue: 2>) ('yellow', <Color.yellow: 3>) ('pink', <Color.pink: 4>)
比较二:__members__
for c in Color.__members__: print(c,end=' ')
# 打印结果 red red_other blue yellow pink 此时不会出值,只有名称
四、枚举的比较
4.1 枚举成员可进行同一性比较
Color.red is Color.red
输出结果是:True
Color.red is not Color.blue
输出结果是:True
4.2 枚举成员可进等值比较
Color.blue == Color.red
输出结果是:False
Color.blue != Color.red
输出结果是:True
4.3 枚举成员不能进行大小比较
Color.red < Color.blue
输出结果出错:TypeError: unorderable types: Color() < Color()
参考链接:https://www.cnblogs.com/ucos/p/5896861.html