枚举
一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。 是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
对于一些既定的值,或不允许随意赋值的量,我们就会使用枚举。
下面我们来定义一个枚举:
from enum import Enum
Animal = Enum('Animal', 'ant bee cat dog')
或者:
# from enum import Enum
class Animals(Enum):
ant = 1
bee = 2
cat = 3
dog = 4
*每个成员的数据类型就是它所属的枚举 自定义的类/枚举 又叫自定义数据类型
我们使用枚举时应注意以下几点:
1).定义枚举时,成员名称不允许重复。及在上面我们定义了ant=1 我们再定义一个ant=2,这时会报错,因为枚举成员名称不允许重复。
2).默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名。
举个例子:
from enum import Enum
class Animals(Enum):
ant = 1
bee = 2
bee_1=2
#因为bee 与 bee_1的值相同,bee_1成了bee的别名,我们尝试:
print(Animals(2))
#得到的结果是Animals.bee
如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员。
3).如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique【要导入unique模块】
from enum import Enum, unique
@unique
class Animals(Enum):
bee = 1
bee_1 = 1
但是一般情况下不建议使用该方法,因为调用值时可能会发生异常
枚举的取值:
from enum import Enum
Animal = Enum('Animal', 'ant bee cat dog')
print(Animal['ant']) #通过成员的名称来获取成员
print(Animal(2)) #通过成员值来获取成员
animals=Animal.cat #通过成员来获取成员的name和value
print( animals.name)
print( animals.value)
上述输出得到:Animal.ant Animal.bee cat 3
可见,既可以用成员名称引用枚举常量,又可以直接根据value的值获得枚举常量。
枚举成员可以进行统一性与等值比较,但是枚举成员之间不能比较大小:
from enum import Enum
Animal = Enum('Animal', 'ant bee cat dog')
print(Animal.ant is Animal.ant)
#True
print(Animal.ant == Animal.ant)
#True
print(int(Animal.ant.value) == int(Animal.ant.value))
#True
print(Animal.ant<Animal.bee)
#输出结果出错:TypeError: unorderable types: Animal() < Animal()
**枚举支持迭代器,可以遍历枚举成员。如下:
from enum import Enum
Animal = Enum('Animal', 'ant bee cat dog')
for i in Animal:
print(i)
输出结果是Animal.ant Animal.bee Animal.cat Animal.dog
如果想把值相同的成员全部遍历出来,我们可以使用__members__,如下:
from enum import Enum
class Color(Enum):
red = 1
red_alias = 1
for color in Color.__members__.items():
print(color)
我们得到结果:
('red', <Color.red: 1>),('red_alias', <Color.red: 1>)
枚举是python非常常用的功能,一定要掌握好。