python3.7如何使用enum_python3 enum模块

枚举是绑定到唯一的常量值的一组符号名称(成员)。在枚举中,成员可以通过身份进行比较,枚举本身可以迭代。

1.Enum模块

该模块定义了四个枚举类,可用于定义唯一的名称和值集:Enum,IntEnum,Flag和IntFlag。它还定义了一个装饰器,unique()和一个helper,auto。

Content

Description

Remarks

class enum.Enum

创建枚举实例的基类

class enum.IntEnum

用于创建同属于int子类枚举常量的基类

class enum.IntFlag

用于创建枚举常量的基类,可以使用按位运算符组合而不会丢失其IntFlag成员资格。 IntFlag成员也是int的子类。

New in version 3.6

class enum.Flag

用于创建枚举常量的基类,可以使用按位运算符组合而不会丢失其IntFlag成员资格。

New in version 3.6

unique()

枚举类装饰器,用于确保任何一个值只有一个名字与其绑定

class enum.auto

实例被替换为枚举成员的合适值

New in version 3.6

2.创建一个枚举类

创建一个枚举类很简单,如下所示:

>>> from enum importEnum>>> classColor(Enum):

... RED= 1... GREEN= 2... BLUE= 3...

说明:

(1) 枚举类得成员值可以是任何值,比如int,str等。如果确定值不重要,你可以使用auto实例来产生一个合适值。但是混用auto实例和其他值一定要慎重。

(2) 类Color是一个枚举。属性Color.RED,Color.GREEN等是枚举成员(或枚举成员),并且是函数常量。枚举成员具有名称和值(Color.RED的名称为RED,Color.BLUE的值为3等)

枚举成员拥有易读的字符表现形式:

>>> print(Color.RED)

Color.RED

利用repr()函数可以得到更多信息:

>>> print(repr(Color.RED))

枚举成员的类型是它所属的枚举:

>>>type(Color.RED)

>>>isinstance(Color.GREEN, Color)

True>>>

枚举成员也有一个只包含其项目名称的属性:

>>> print(Color.RED.name)

RED

枚举支持迭代,按定义顺序:

>>> classShake(Enum):

... VANILLA= 7... CHOCOLATE= 4... COOKIES= 9... MINT= 3...>>> for shake inShake:

...print(shake)

...

Shake.VANILLA

Shake.CHOCOLATE

Shake.COOKIES

Shake.MINT

枚举成员可以是哈希的,所以它们可以在字典和集合中使用:

>>> apples ={}>>> apples[Color.RED] = 'red delicious'

>>> apples[Color.GREEN] = 'granny smith'

>>> apples == {Color.RED: 'red delicious', Color.GREEN: 'granny smith'}

True

3.程序访问枚举成员及其属性

有时候以编程方式访问成员函数(即Color.RED不会执行的情况是有用的,因为在程序写入时间没有确切的颜色)。枚举允许这样的访问:

>>> Color(1)

>>> Color(3)

如果你想用名字访问枚举成员,可以使用项目访问:

>>> Color['RED']

>>> Color['GREEN']

如果你有一个枚举成员,并且需要它的名字和值:

>>> member =Color.RED>>>member.name'RED'

>>>member.value1

4.复用枚举成员和值

两个枚举成员拥有相同的名字是不合法的:

>>> classShape(Enum):

... SQUARE= 2... SQUARE= 3...

Traceback (most recent call last):

...

TypeError: Attempted to reuse key:'SQUARE'

但是,两个枚举成员允许拥有相同的值。如果两个成员A和B有相同的值(并且A先定义),B是A的一个别名。根据值查询A和B都会放回A。根据名字查询B也会返回A。

>>> classShape(Enum):

... SQUARE= 2... DIAMOND= 1... CIRCLE= 3... ALIAS_FOR_SQUARE= 2...>>>Shape.SQUARE

>>>Shape.ALIAS_FOR_SQUARE

>>> Shape(2)

注意:尝试去创建一个与已定义属性同名的成员或者尝试创建一个与成员同名的方法是不允许的。

5.确保唯一的枚举值

默认情况下,枚举允许多个名称作为同一个值的别名。当不需要此行为时,可以使用以下装饰器来确保每个值在枚举中仅使用一次:

@enum.unique

专门用于枚举的类装饰器。它搜索枚举的__members__收集它发现的任何别名;如果有的话,会发现ValueError带有细节:

>>> from enum importEnum, unique>>>@unique

...classMistake(Enum):

... ONE= 1... TWO= 2... THREE= 3... FOUR= 3...

Traceback (most recent call last):

...

ValueError: duplicate values foundin : FOUR -> THREE

6.使用自动赋值

如果确切的值不重要,您可以使用auto:

>>> from enum importEnum, auto>>> classColor(Enum):

... RED=auto()

... BLUE=auto()

... GREEN=auto()

...>>>list(Color)

[, , ]

auto产生的值由_generate_next_value_()函数产生,该函数可以被重写:

>>> classAutoName(Enum):

...def_generate_next_value_(name, start, count, last_values):

...returnname

...>>> classOrdinal(AutoName):

... NORTH=auto()

... SOUTH=auto()

... EAST=auto()

... WEST=auto()

...>>>list(Ordinal)

[, , , ]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值