zoukankan      html  css  js  c++  java
  • Python知识点记录五(枚举类)

    枚举类

    对于一组特定含义的各异常量的集合,在编程中可以通过“枚举”的方式实现,在Python3中也引入了这一概念,并且通过枚举类进行了实现。

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

    需要注意的是,对于枚举类而言,与一般的类不同,它不能实例化,某一个枚举类本身就是一个单例的实现。

    枚举类可以通过“枚举类名.属性名”的方式访问枚举项,注意这里的枚举项本身是一个枚举类型,如果要访问其对应的名称、值,需要分别通过“枚举类名.属性名.name”和“枚举类名.属性名.value”:

    from enum import Enum
    
    class VIP(Enum):
        YELLOW = 1
        GREEN = 2
        BLACK = 3
        RED = 4
    
    print(VIP.GREEN) #打印GREEN这个枚举项
    print(VIP.GREEN.name) #打印GREEN这个枚举项的属性名
    print(VIP.GREEN.value) #打印GREEN这个枚举项的值
    
    '''
    输出:
    VIP.GREEN
    GREEN
    2
    '''

    枚举类同样可以通过for/in遍历:

    from enum import Enum
    
    class VIP(Enum):
        YELLOW = 1
        GREEN = 2
        BLACK = 3
        RED = 4
    
    for v in VIP:
        print(v, end = '--')
        print('%s, %d' %(v.name, v.value))
    
    '''
    VIP.YELLOW--YELLOW, 1
    VIP.GREEN--GREEN, 2
    VIP.BLACK--BLACK, 3
    VIP.RED--RED, 4
    '''

    在“枚举”这一概念中,枚举的“含义”(对应于上述代码的属性,如YELLOW,GREEN等)不能相同,其对应的值也不能相等。

    在Python3通过枚举类对“枚举”的实现中,同样不能有相同的含义(即枚举类不能有相同的属性名),如果代码中包含了相同的属性名,则会报错;而对于不同的含义(属性名),则是可以有相同的值的,Python不会报错。

    from enum import Enum
    
    class VIP(Enum):
        YELLOW = 1
        YELLOW = 2  #程序报错,不能同名
        BLACK = 3
        RED = 4

    from enum import Enum

    class VIP(Enum):
    YELLOW = 1
    GREEN = 1 #程序不会报错
    BLACK = 3
    RED = 4

    print(VIP.GREEN)

    for v in VIP:
    print(v)

    '''
    输出:
    VIP.YELLOW
    VIP.YELLOW
    VIP.BLACK
    VIP.RED
    '''

    虽然给不同的属性名设置相同的值不会报错,但在上例代码我们可以发现,对VIP这个枚举类来说,GREEN这个枚举项并不存在(无法遍历访问到),甚至直接通过VIP.GREEN访问得到的也是VIP.YELLOW这个项。这是因为在PYTHON的设计中,对于拥有相同值的项,都会被默认为等同于第一个设置该值的项,其余项为该项的别名。

    如果要访问代码设计中的所有项,可以通过VIP.__members__访问:

    from enum import Enum
    
    class VIP(Enum):
        YELLOW = 1
        GREEN = 1  #程序不会报错
        BLACK = 3
        RED = 4
    
    for v in VIP.__members__:
        print(v)
    
    '''
        输出:
    YELLOW
    GREEN
    BLACK
    RED
    '''

    对于一个已实现的枚举类而言,其本身就是一个常量,那么一个应用场景是,如果有某个变量,需要判断它是否对应于这个枚举类的某一项,该如何操作?

    比如对于周一到周日,如果某个为1-7之间的变量,需要判断它是否能匹配于星期几这个枚举类,通常可以想到通过if来判断:

    from enum import Enum
    
    class WEEKDAY(Enum):
        MONDAY = 1
        TUESDAY = 2
        WEDNESDAY = 3
        THURSDAY = 4
        FRIDAY = 5
        SATURDAY = 6
        SUNDAY = 7
    
    a = 6
    for v in WEEKDAY:
        if a == v.value:
            print(v.name)
            break

    但PYTHON中提供了一种更方便的途径:枚举类名(变量),前提是这个变量值必须在枚举类各项的值范围内,否则会报错:

    from enum import Enum
    
    class WEEKDAY(Enum):
        MONDAY = 1
        TUESDAY = 2
        WEDNESDAY = 3
        THURSDAY = 4
        FRIDAY = 5
        SATURDAY = 6
        SUNDAY = 7
    
    a = 6
    print(WEEKDAY(a))   #输出WEEKDAY.SATURDAY
  • 相关阅读:
    [LeetCode] 157. Read N Characters Given Read4 用Read4来读取N个字符
    [LeetCode] 158. Read N Characters Given Read4 II
    AndroidManifest.xml文件详解(activity)(一)
    Android中Bitmap、Drawable、byte[]转换
    图片和byte[]数组互转
    EditText 属性
    adb server didn't ack failed to start daemon
    PhoneGap 获得设备属性Demo
    PhoneGap 第一个程序
    android手机常用分辨率
  • 原文地址:https://www.cnblogs.com/tsembrace/p/9124983.html
Copyright © 2011-2022 走看看