enum是一个用来枚举的模块
import enum # 建立一个类,继承自enum下的Enum class Color(enum.Enum): red = 1 green = 2 blue = 3 yellow = 4 pink = 5 cyan = 6 # 下面即可以经过名称直接获取成员 print(Color["red"], type(Color["red"])) # Color.red <enum 'Color'> print(Color.red, type(Color.red)) # Color.red <enum 'Color'> # 打印的是<enum 'Color'>类型 # 那么如何获取里面的值呢? # 调用name获取名称,调用value获取值 print(Color.red.name, type(Color.red.name)) # red <class 'str'> print(Color.red.value) # 1 # 也能够经过迭代来获取值 for c in Color: print(c.name, c.value) """ red 1 green 2 blue 3 yellow 4 pink 5 cyan 6 """
import enum # 若是我定义了重复的key(仮) try: class Color(enum.Enum): red = 1 green = 2 blue = 3 yellow = 4 pink = 5 cyan = 6 cyan = 5 except Exception as e: print(e) # Attempted to reuse key: 'cyan' # 提示咱们key重复了
import enum # 若是我定义了重复的value(仮) class Color(enum.Enum): red = 1 green = 2 blue = 3 yellow = 4 pink = 5 cyan = 6 purple = 6 # 这是经过value来获取成员 # 获取成员能够经过Color.key | Color[key]的方式,还能够使用Color(value)的方式 print(Color(6).name) # cyan print(Color.purple.name) # cyan # 能够看到只打印了cyan # 若是值相同的话,那么后者至关于前者的别名,二者指向的内容是同样的 for c in Color: print(c) """ Color.red Color.green Color.blue Color.yellow Color.pink Color.cyan """ # purple依旧没有打印 # 那若是我就想把值相同的也打印出来,要怎么作呢? # 枚举内部有一个__members__属性,至关于一个字典 for c in Color.__members__.items(): print(c[0], c[1]) """ red Color.red green Color.green blue Color.blue yellow Color.yellow pink Color.pink cyan Color.cyan purple Color.cyan """ # 第一个元素是key,str类型。第二个元素是枚举类型。 # 能够看到最后一个,即使key是purple,可是对应的枚举类型依旧是Color.cyan for c in Color.__members__.items(): print(c[0], c[1], c[1].name, c[1].value) """ red Color.red red 1 green Color.green green 2 blue Color.blue blue 3 yellow Color.yellow yellow 4 pink Color.pink pink 5 cyan Color.cyan cyan 6 purple Color.cyan cyan 6 """ # 最后一个打印的还是cyan # 成员以前也能够进行比较,但只支持is和==操做符,不支持大小比较 print(Color.green is Color.red) # False print(Color.green is Color.green) # True print(Color.cyan is Color.purple) # True print(Color.cyan == Color.purple) # True
import enum class Color(enum.Enum): red = 1 green = 2 blue = 3 yellow = 4 pink = 5 cyan = 6 purple = 6 try: Color.red.name = "xxx" except Exception as e: print(e) # can't set attribute try: Color.red.value = "xxx" except Exception as e: print(e) # can't set attribute # 能够看到是没法赋值的
import enum class Color(enum.Enum): red = 1 green = 2 blue = 3 yellow = 4 pink = 5 cyan = [] purple = [] print(Color.cyan is Color.purple) # True Color.cyan.value.append(123) print(Color.cyan is Color.purple) # True """ 能够看到,尽管没法从新赋值,可是本地修改仍是能够的,若是是可变类型的话 可是两个仍是同样的,由于purple是cyan的别名,当在建立这个类的时候,因为都是空列表,因此认为二者是同样 所以当我对cyan.value进行append的时候,会影响purple """ print(Color.cyan.value) # [123] print(Color.purple.value) # [123] Color.purple.value.append(456) # 经过反过来也是同样的 print(Color.cyan.value) # [123, 456] print(Color.purple.value) # [123, 456]
枚举类,key重复是不容许的,可是值重复是能够的,可若是我也不容许值重复呢?只须要加上一个装饰器便可
python
import enum try: @enum.unique class Color(enum.Enum): red = 1 green = 2 blue = 3 yellow = 4 pink = 5 cyan = [] purple = [] except Exception as e: print(e) # duplicate values found in <enum 'Color'>: purple -> cyan # 提示咱们purple和cyan的value重复了
以前说过,枚举成员是不支持大小比较的,但若是我想支持呢?
app
import enum # 换一种继承的类,改为IntEnum class Color(enum.IntEnum): red = 1 green = 2 blue = 3 yellow = 4 pink = 5 cyan = "6" # 此时里面的成员要是int类型,或者能将字符串转成int print(Color.red < Color.blue) # True print(Color.red + Color.cyan) # 7