python学习16

枚举

一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。 是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的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非常常用的功能,一定要掌握好。


猜你喜欢

转载自blog.csdn.net/gy_334/article/details/80457840