Python3(八) 枚举详解

99封情书 提交于 2020-02-10 20:20:05

一.枚举其实是一个类

建议标识名字用大写

1.枚举类:

from enum import Enum
 
 
class VIP(Enum):
 
    YELLOW = 1
 
    GREEN = 2
 
    BLACK = 3
 
    RED = 4
 
 
print(VIP.YELLOW)
 
#VIP.YELLOW    #关注的是它的标签不是数字

2 枚举和普通类相比的优势

  三种其他的普通方法表示枚举:

(1)

yellow = 1

green = 2

(2)字典的表示方式

{'yellow':1,'green':2}    

(3)类的表示方式

class TypeDiamond():

    yellow = 1

    green = 2

这些方式,它们都是可变的,可以在代码中轻易的更改值,且没有防止相同标签的功能。

 

3.枚举的特点:

from enum import Enum
 
class VIP(Enum):
 
    YELLOW = 1
 
   #YELLOW= 2   #不可重复,报错
 
    BLACK = 3
 
    RED = 4
 
print(VIP.YELLOW)
 
#VIP.YELLOW = 6    #不可更改,报错

二.枚举类型、枚举名称与枚举值

1.获取枚举类型下某一数值:

from enum import Enum
 
class VIP(Enum):
 
    YELLOW = 1
 
    GREEN = 2
 
    BLACK = 3
 
    RED = 4
 
    
 
print(VIP.YELLOW.value)
 
print(VIP.YELLOW.name)
 
print(VIP.YELLOW)
 
print(VIP['YELLOW'])
 
#1        #枚举值
 
#YELLOW    #<class 'str'> 获取标签名
 
#VIP.YELLOW    #<enum 'VIP'>    枚举类型
 
#VIP.YELLOW    

2.枚举是可以遍历的:

from enum import Enum
 
 
class VIP(Enum):
 
    YELLOW = 1
 
    GREEN = 2
 
    BLACK = 3
 
    RED = 4
 
for v in VIP :
 
    print(v)
 
#VIP.YELLOW
VIP.GREEN
VIP.BLACK
VIP.RED

三. 枚举的比较运算 

1.两个枚举之间可以使用等值比较(==),枚举与数值比较的判断结果不对。两个枚举之间不能进行大小比较。

2.支持is操作:

result = VIP.GREEN is VIP.GREEN
 
#True

3.两个大类之间也可以进行等值比较,不过结果是False:

from enum import Enum
 
class VIP(Enum):
 
    YELLOW = 1
 
    GREEN = 2
 
    BLACK = 3
 
    RED = 4
 
class VIP1(Enum):
 
    YELLOW = 1
 
    GREEN = 2
 
    BLACK = 3
 
    RED = 4
 
print(VIP.GREEN ==VIP1.GREEN)
 
#False

四.枚举注意事项

1.枚举的数值可以相同,在这种情况下,将第二种枚举类型看成别名。遍历时不会打印别名:

class VIP(Enum):
 
    YELLOW = 1
 
    GREEN = 1    #别名,不会报错
 
    BLACK = 3
 
    RED = 4
 
print(VIP.GREEN)
 
#VIP.YELLOW

2.把别名加入遍历循环:

(1)
for v in VIP.__members__.items() :
 
    print(v)
 
#('YELLOW', <VIP.YELLOW: 1>)
 
#('GREEN', <VIP.GREEN: 1>)
 
#('BLACK', <VIP.BLACK: 3>)
 
#('RED', <VIP.RED: 4>)
 
(2)
 
或者遍历__members__:
 
for v in VIP.__members__:
 
    print(v)
 
#YELLOW
 
#GREEN
 
#BLACK
 
#RED

五.枚举转换

1.在数据库里一般存储数值或者标签名字来代表枚举类型,推荐存储数值,数字占用的空间更小。但是不建议在代码种用数值代表枚举,可读性不强。

2.如何将数字转换成枚举类型: 

from enum import Enum
 
a = 1
 
class VIP(Enum):
 
    YELLOW = 1
 
    GREEN = 2
 
    BLACK = 3
 
    RED = 4
 
print(VIP(a))    #转换枚举类型
 
#VIP.YELLOW

六.枚举小结

1.要求每个枚举类型都是数字的时候继承IntEnum:

from enum import IntEnum
 
class VIP(IntEnum):
 
    YELLOW = 1
 
    GREEN = 2
 
    BLACK = 3
 
    RED = 4

2.限制不同的枚举类型不能取相同的值:

from enum import Enum
 
from enum import IntEnum,unique
 
@unique    #装饰器
 
class VIP(IntEnum):
 
    YELLOW = 1
 
    GREEN = 2
 
    BLACK = 3
 
    RED = 4

枚举类型不能实例化,属于单例模式

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!