zoukankan      html  css  js  c++  java
  • python 枚举Enum类的使用

    1. 枚举的定义

    1. 首先,定义枚举要导入enum模块。
    2. 枚举定义用class关键字,继承Enum类。

      示例代码:

    复制代码
    from enum import Enum

    class Color(Enum): red = 1 orange = 2 yellow = 3 green = 4 blue = 5 indigo = 6 purple = 7
    复制代码

      代码分析:

    1. 上面的代码,我们定义了颜色的枚举Color.
    2. 颜色枚举有7个成员,分别是Color.red、Color.orange、Color.yellow等。
    3. 每一个成员都有它们各自名称和值,Color.red成员的名称是:red,值是:1。
    4. 每个成员的数据类型就是它所属的枚举。【*注:用class定义的类,实际上就是一种类型】
    1.1 定义枚举时,成员名称不允许重复   
    from enum import Enum

    class Color(Enum): red = 1 red = 2

      上面的代码,就无法执行。提示错误:TypeError: Attempted to reuse key: 'red'

     1.2 默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名  

    from enum import Enum

    class Color(Enum): red = 1 red_alias = 1

      成员Color.red和Color.red_alias具有相同的值,那么成员Color.red_alias的名称red_alias就被视作成员Color.red名称red的别名。

       1.3 如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员

    复制代码
    from enum import Enum

    class Color(Enum): red = 1 red_alias = 1 print(Color(1))
    复制代码

      输出结果为:Color.red

     1.4 如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique【要导入unique模块】

    复制代码
    from enum import Enum, unique
    
    
    @unique
    class Color(Enum):
        red = 1
        red_alias = 1
    复制代码

      再执行就会提示错误:ValueError: duplicate values found in <enum 'Color'>: red_alias -> red

    2. 枚举取值 

     2.1 通过成员的名称来获取成员

    Color['red']

     2.2 通过成员值来获取成员

    Color(2)

     2.3 通过成员,来获取它的名称和值

    red_member = Color.red
    red_member.name
    red_member.value

    3. 迭代器

     3.1 枚举支持迭代器,可以遍历枚举成员

    for color in Color:
        print(color)

      输出结果是,枚举的所有成员。Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。

      使用print(color.value) 可以打印出所有成员的值. 1 2 3 4 5 6 7

     3.2 如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员

    复制代码
    from enum import Enum
    
    
    class Color(Enum):
        red = 1
        orange = 2
        yellow = 3
        green = 4
        blue = 5
        indigo = 6
        purple = 7
        red_alias = 1
    
    
    for color in Color:
        print(color)
    复制代码

      输出结果是:Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。但是Color.red_alias并没有出现在输出结果中。

     3.3 如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性__members__

    复制代码
    from enum import Enum
    
    
    class Color(Enum):
        red = 1
        orange = 2
        yellow = 3
        green = 4
        blue = 5
        indigo = 6
        purple = 7
        red_alias = 1
    
    
    for color in Color.__members__.items():
        print(color)
    复制代码

      输出结果:('red', <Color.red: 1>)、('orange', <Color.orange: 2>)、('yellow', <Color.yellow: 3>)、('green', <Color.green: 4>)、('blue', <Color.blue: 5>)、

           ('indigo', <Color.indigo: 6>)、('purple', <Color.purple: 7>)、('red_alias', <Color.red: 1>)

    4. 枚举比较

     4.1 枚举成员可进行同一性比较

    Color.red is Color.red

      输出结果是:True

    Color.red is not Color.blue

      输出结果是:True

     4.2 枚举成员可进等值比较

    Color.blue == Color.red

      输出结果是:False

    Color.blue != Color.red

      输出结果是:True

     4.3 枚举成员不能进行大小比较

    Color.red < Color.blue

      输出结果出错:TypeError: unorderable types: Color() < Color()

  • 相关阅读:
    convert image to base64 and post to RESTful wcf
    在android webview实现截屏的手动tounchmove裁剪图片
    How to use jquery ajax and android request security RESTful WCF
    using swfUpload in asp.net mvc
    using HttpClient and sending json data to RESTful server in adroind
    ODP.NET数据访问
    android image watermark
    解决国内不能访问github的问题
    idapro权威指南第二版阅读笔记第九章 交叉引用和绘图功能
    idapro权威指南第二版阅读笔记第二章 逆向和反汇编工具
  • 原文地址:https://www.cnblogs.com/skaarl/p/10279428.html
Copyright © 2011-2022 走看看