Python学习(18):枚举类型

一、Python中的枚举

Python中的枚举是作为一个类存在的,这是与其他语言的一个较为鲜明的特征,总结它的用法特点如下:
1. Python枚举作为一个类存在,使用它需要首先导入枚举模块,然后继承并自定义需要的枚举类;
2. 导入枚举模块可以是Enum(枚举值可以是任意类型),也可以是IntEnum(枚举值只能是整型);
3. 枚举类不允许存在相同的标签;但是允许不同标签的枚举值相同,这样后者相当于前者别名;
4. 不同的枚举类型,即使枚举名和枚举值都一样,比较结果也是False
5. 枚举类的值不可以被外界更改

二、Python枚举的基本用法

定义一个枚举如下:

#第一步:导入枚举类
from enum import Enum

#第二步:通过继承的方式,定义一个适合我们使用的枚举类
#枚举的名字一般都大写
#继承Enum后枚举值可以是字符串也可以是整型,如果IntEnum则必须整型

class QQVIP(Enum):
    RED = 1    
    GREEN = 2
    BLUE = 3
    BLUE_ALIAS= 3
    OTHERCOLOR = "othercolor"

1.打印枚举信息

#1.1打印枚举类型,得到的是一个枚举类型
print(QQVIP.GREEN)           #打印结果:QQVIP.GREEN

#1.2打印枚举名,得到的是一个字符串
print(QQVIP.GREEN.name)      #打印结果:GREEN
print(QQVIP.OTHERCOLOR.name) #打印结果:OTHERCOLOR

#1.3.打印枚举值
print(QQVIP.GREEN.value)     #打印结果:2

#1.4.测试枚举值不可更改,否则报错
#QQVIP.GREEN = 100        

#1.5.通过枚举名称获取枚举
print(QQVIP['GREEN'])        #打印:QQVIP.GREEN
print(QQVIP['OTHERCOLOR'])   #打印:QQVIP.OTHERCOLOR

2.遍历枚举

#2.1.由于BLUE与BLUE_ALIAS枚举值相同,BLUE_ALIAS相当于BLUE的别名,所以没有被打印出来
forvalue inQQVIP:
    print(value)
'''
打印结果:
QQVIP.RED
QQVIP.GREEN
QQVIP.BLUE
QQVIP.OTHERCOLOR
'''

#2.2.可以打印出所有的枚举值包括别名,使用__members__
forvalue inQQVIP.__members__:
    print(value)
'''
打印结果:
RED
GREEN
BLUE
BLUE_ALIAS
OTHERCOLOR
'''

#2.3打印出枚举的所有信息,得到是元组
forvalue inQQVIP.__members__.items():
    print(value)
'''
('RED', <QQVIP.RED: 1>)
('GREEN', <QQVIP.GREEN: 2>)
('BLUE', <QQVIP.BLUE: 3>)
('BLUE_ALIAS', <QQVIP.BLUE: 3>)
('OTHERCOLOR', <QQVIP.OTHERCOLOR: 'othercolor'>)
'''

3.枚举的比较

#3.1两个枚举值可以做等值比较
result1 = QQVIP.RED == QQVIP.GREEN
print(result1)   #打印:False
result2 = QQVIP.RED == QQVIP.RED
print(result2)   #打印:True

#3.2另一种比较
result2_1 = QQVIP.RED is QQVIP.RED
print(result2_1) #打印:True

#3.3两个枚举值不支持大小比较
#result3 = QQVIP.RED > QQVIP.GREEN
#print(result3)   #打印:报错

#3.4:枚举值和对应值比较,并不相等
result4 = QQVIP.RED == 1
print(result4)   #打印 False

4.枚举别名

不同标签但是枚举值相同,后者是前者别名

print(QQVIP.BLUE)
print(QQVIP.BLUE_ALIAS)   #打印结果都是BLUE

5.枚举转换

通过具体值得到枚举类型

num = 2
print(QQVIP(num))  #打印:QQVIP.GREEN

三、枚举的特殊用法

创建一个枚举:枚举值只能是整型且不允许设置别名

from enum import IntEnum,unique
#枚举类的的特殊使用
@unique
class Grade(IntEnum):
    Heigh  = 1
    #Heigh_Alias = 2   #报错重复值,设置unique后,不能设置别名
    medium = 2
    Low = 3 
    #Lower = "Lower"  #报错,因为继承IntEnum,所以枚举值只能是Int

猜你喜欢

转载自blog.csdn.net/dreamcoffeezs/article/details/80620987