Python的枚举类enum

系统 1339 0

枚举的作用简述:

枚举本身的意思就是一一列举出来,在python及其它语言中,枚举就是将该类型变量的所有可能取的值事先一一列举出来,然后限制该变量在实际使用中就只能在这些值的范围内取值。

使用枚举类有哪些好处

枚举类可以方便地表示星期,月份等常数类型,如果你不用枚举类,那么你只能用数字或者字符串。如果你使用数字,用1-7来表示星期数,但一个数字在程序中不仅可以表示星期数,可能还有其他许多含义,这样你在写程序时就必须时刻记住这些数字的含义,这降低了程序的可读性,也导致容易出错。而当你使用字符串时,虽然没有明显的缺点,但在内存中字符串所占内存要比数字多,这就降低了程序的效率。

枚举类正好弥补了这两方面的缺点,你可以在代码中使用枚举类,但在内存中存放时使用的是数字,既提高了可读性,又提高了程序效率。更重要的是,Python中的枚举类型是不可变类型,又可以进行迭代,这就意味着你可以随时使用枚举类型而不用担心改变了枚举类型的值。

枚举适用的python版本

enum 标准模块在 3.4 版本才可以使用,3.3以下版本需要独立安装:https://pypi.python.org/pypi/enum34#downloads,官方说明:
enum34 is the new Python stdlib enum module available in Python 3.4
backported for previous versions of Python from 2.4 to 3.3. tested on
2.6, 2.7, and 3.3+

枚举模块的使用

首先,定义枚举要导入enum模块。
枚举定义用class关键字,继承Enum类。
  示例代码:

            
              
                from
              
               enum 
              
                import
              
               Enum


              
                class
              
              
                Color
              
              
                (
              
              Enum
              
                )
              
              
                :
              
              
    red 
              
                =
              
              
                1
              
              
    orange 
              
                =
              
              
                2
              
              
    yellow 
              
                =
              
              
                3
              
              
    green 
              
                =
              
              
                4
              
              
    blue 
              
                =
              
              
                5
              
              
    indigo 
              
                =
              
              
                6
              
              
    purple 
              
                =
              
              
                7
              
              
                print
              
              
                (
              
              
                type
              
              
                (
              
              Color
              
                .
              
              red
              
                )
              
              
                )
              
              
                #
                
                   每个成员的数据类型就是它所属的枚举
                
              
            
          

代码分析:
上面的代码,我们定义了颜色的枚举类Color.它有7个成员,分别是Color.red、Color.orange、Color.yellow等。
每一个成员都有它们各自名称和值,Color.red成员的名称是:red,值是:1。
每个成员的数据类型就是它所属的枚举。【*注:用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 : red_alias -> red

2. 枚举取值

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

            
              Color
              
                [
              
              
                'red'
              
              
                ]
              
              
                #Color.red
              
              
或
Color
              
                .
              
              red     
              
                #Color.red
              
            
          

2.2 通过成员值来获取成员(第一个取该值的成员)

            
              Color
              
                (
              
              
                1
              
              
                )
              
              
                #Color.red
              
            
          

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

            
              
                print
              
              
                (
              
              Color
              
                .
              
              red
              
                .
              
              name
              
                )
              
              
                #red
              
              
                print
              
              
                (
              
              Color
              
                (
              
              
                1
              
              
                )
              
              
                .
              
              name
              
                )
              
              
                #red
              
              
                print
              
              
                (
              
              Color
              
                .
              
              red
              
                .
              
              value
              
                )
              
              
                #1
              
              
                print
              
              
                (
              
              Color
              
                (
              
              
                1
              
              
                )
              
              
                .
              
              value
              
                )
              
              
                #1
              
            
          

3. 迭代器

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

            
              
                for
              
               color 
              
                in
              
               Color
              
                :
              
              
                print
              
              
                (
              
              color
              
                )
              
            
          

输出结果是,枚举的所有成员。

            
              Color
              
                .
              
              red
Color
              
                .
              
              orange
Color
              
                .
              
              yellow
Color
              
                .
              
              green
Color
              
                .
              
              blue
Color
              
                .
              
              indigo
Color
              
                .
              
              purple

Process finished 
              
                with
              
               exit code 
              
                0
              
            
          

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’, )、(‘orange’, )、(‘yellow’, )、(‘green’, )、(‘blue’, )、(‘indigo’, )、(‘purple’, )、(‘red_alias’, )

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()

别人写的例子:

            
              
                from
              
               enum 
              
                import
              
               Enum
              
                ,
              
               unique

@unique

              
                class
              
              
                Weekday
              
              
                (
              
              Enum
              
                )
              
              
                :
              
              
    Sun 
              
                =
              
              
                0
              
              
    Mon 
              
                =
              
              
                1
              
              
    Tue 
              
                =
              
              
                2
              
              
    Wed 
              
                =
              
              
                3
              
              
    Thu 
              
                =
              
              
                4
              
              
    Fri 
              
                =
              
              
                5
              
              
    Sat 
              
                =
              
              
                6
              
              

day1 
              
                =
              
               Weekday
              
                .
              
              Mon


              
                print
              
              
                (
              
              
                'day1 ='
              
              
                ,
              
               day1
              
                )
              
              
                print
              
              
                (
              
              
                'Weekday.Tue ='
              
              
                ,
              
               Weekday
              
                .
              
              Tue
              
                )
              
              
                print
              
              
                (
              
              
                'Weekday[\'Tue\'] ='
              
              
                ,
              
               Weekday
              
                [
              
              
                'Tue'
              
              
                ]
              
              
                )
              
              
                print
              
              
                (
              
              
                'Weekday.Tue.value ='
              
              
                ,
              
               Weekday
              
                .
              
              Tue
              
                .
              
              value
              
                )
              
              
                print
              
              
                (
              
              
                'day1 == Weekday.Mon ?'
              
              
                ,
              
               day1 
              
                ==
              
               Weekday
              
                .
              
              Mon
              
                )
              
              
                print
              
              
                (
              
              
                'day1 == Weekday.Tue ?'
              
              
                ,
              
               day1 
              
                ==
              
               Weekday
              
                .
              
              Tue
              
                )
              
              
                print
              
              
                (
              
              
                'day1 == Weekday(1) ?'
              
              
                ,
              
               day1 
              
                ==
              
               Weekday
              
                (
              
              
                1
              
              
                )
              
              
                )
              
              
                for
              
               name
              
                ,
              
               member 
              
                in
              
               Weekday
              
                .
              
              __members__
              
                .
              
              items
              
                (
              
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              name
              
                ,
              
              
                '=>'
              
              
                ,
              
               member
              
                )
              
              

Month 
              
                =
              
               Enum
              
                (
              
              
                'Month'
              
              
                ,
              
              
                (
              
              
                'Jan'
              
              
                ,
              
              
                'Feb'
              
              
                ,
              
              
                'Mar'
              
              
                ,
              
              
                'Apr'
              
              
                ,
              
              
                'May'
              
              
                ,
              
              
                'Jun'
              
              
                ,
              
              
                'Jul'
              
              
                ,
              
              
                'Aug'
              
              
                ,
              
              
                'Sep'
              
              
                ,
              
              
                'Oct'
              
              
                ,
              
              
                'Nov'
              
              
                ,
              
              
                'Dec'
              
              
                )
              
              
                )
              
              
                for
              
               name
              
                ,
              
               member 
              
                in
              
               Month
              
                .
              
              __members__
              
                .
              
              items
              
                (
              
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              name
              
                ,
              
              
                '=>'
              
              
                ,
              
               member
              
                ,
              
              
                ','
              
              
                ,
              
               member
              
                .
              
              value
              
                )
              
            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论