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

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

  • 相关阅读:
    文件上传、下载测试点总结
    selenium+Python(Page Object 设计模式实例)
    Python面向对象
    Python内置函数
    Python异常处理
    Python文件的I/o
    vue-router 二级路由
    vue中如何获取后台数据
    移动端适配问题
    vue中钩子函数的用法
  • 原文地址:https://www.cnblogs.com/wlgaojin/p/12292200.html
Copyright © 2011-2022 走看看