zoukankan      html  css  js  c++  java
  • Python3(八) 枚举详解

    一.枚举其实是一个类

    建议标识名字用大写

    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 = 22)字典的表示方式
    
    {'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

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

  • 相关阅读:
    函数进阶:闭包、装饰器、列表生成式、生成器、迭代器
    函数基础:内置函数
    Python函数基础---参数、变量
    python函数基础:嵌套函数、作用域、匿名函数、高阶函数、递归函数
    三元运算、文件操作
    Python终端如何输出彩色字体
    文件处理: read、readline、 readlines()
    16进制、编码问题
    JSON 操作与转化
    高并发和大型网站架构相关
  • 原文地址:https://www.cnblogs.com/wlgaojin/p/12292200.html
Copyright © 2011-2022 走看看