5.9 enum--支持枚举类型

enum模块提供了枚举类型的支持。枚举类型是由一个名称和一个统一值来组成,值是常量的值,它们之间可以通过名称进行比较和引用,还可以迭代访问。

5.9.1 模块内容

本模块主要定义了两种枚举类型:EnumIntEnum。定义了一个装饰器函数unique(),以便保证所有枚举常量的唯一性。

class enum.Enum 

构造枚举常量的基类。

例子:

#python 3.4

import enum

 

class Color(enum.Enum):

    red = 1

    green = 2

    blue = 3

 

print(Color.red, repr(Color.red))

print(Color.green)

print(Color.blue)

结果输出如下:

Color.red <Color.red: 1>

Color.green

Color.blue

 

class enum.IntEnum 

构造以整数值为枚举值的基类。本类里的枚举值可以与整数相比较,普通的枚举类是不能与整数相比较的。此类主要用为了旧的代码兼容,或者大大地提高了便利性的场合,否则还是使用普通的枚举类会比较好,因为它不与普通类型相互发生作用,避免了一些编程上失误。

例子:

#python 3.4

import enum

 

class Color(enum.IntEnum):

    red = 1

    green = 2

    blue = 3

 

print(Color.red, repr(Color.red))

print(Color.green)

print(Color.blue)

print(Color.red == 1)

结果输出如下:

Color.red <Color.red: 1>

Color.green

Color.blue

True

 

enum.unique() 

本装饰器函数保证了每个名称只能绑定一个值,达到枚举值的唯一性。

例子:

#python 3.4

import enum

 

class Color(enum.IntEnum):

    red = 1

    green = 2

    blue = 3

    red = 5

    

print(Color.red, repr(Color.red))

print(Color.green)

print(Color.blue)

结果输出如下:

Traceback (most recent call last):

  File "F:/temp/pywin/enum1.py", line 4, in <module>

    class Color(enum.IntEnum):

  File "F:/temp/pywin/enum1.py", line 8, in Color

    red = 5

  File "C:\Python34\lib\enum.py", line 66, in __setitem__

    raise TypeError('Attempted to reuse key: %r' % key)

TypeError: Attempted to reuse key: 'red'

 

枚举常量可以迭代遍历:

例子:

#python 3.4

import enum

 

class Color(enum.IntEnum):

    red = 1

    green = 2

    blue = 3

 

for i in Color:

    print(i)

结果输出如下:

Color.red

Color.green

Color.blue

 

枚举常量访问方式:

例子:

#python 3.4

import enum

 

class Color(enum.IntEnum):

    red = 1

    green = 2

    blue = 3

 

print(Color(2))

print(Color['red'])

red = Color.red

print(red.name, red.value)

结果输出如下:

Color.green

Color.red

red 1

在这里提供三种访问方式:Color(2),  Color[‘red’],  red.value

 

通过函数API方式创建枚举常量:

例子:

#python 3.4

import enum

 

Animal = enum.Enum('Animal', 'ant bee cat dog')

print(Animal)

print(list(Animal))

结果输出如下:

<enum 'Animal'>

[<Animal.ant: 1>, <Animal.bee: 2>, <Animal.cat: 3>, <Animal.dog: 4>]

 

避免每个枚举常量都需要指定值:

例子:

#python 3.4

import enum

 

class AutoNumber(enum.Enum):

     def __new__(cls):

         value = len(cls.__members__) + 1

         obj = object.__new__(cls)

         obj._value_ = value

         return obj

 

class Color(AutoNumber):

     red = ()

     green = ()

     blue = ()

for i in Color:

    print(repr(i))

结果输出如下:

<Color.red: 1>

<Color.green: 2>

<Color.blue: 3>




蔡军生  QQ:9073204  深圳

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值