【Python】枚举的定义和使用(enum)


枚举简介

为什么需要枚举?枚举是用来定义常量的。枚举元素具有不可变的特性,可以用来充当常量。

枚举是与唯一常量值绑定的一系列符号名称(成员)的集合。枚举中的元素可以进行恒等比较,并且枚举本身可迭代。

例如,对于圆周率,我们在 Python 中简单定义 PI = 3.14,但 PI 是变量,是可以被修改的,故更严格地定义常量需要用到枚举。本文是对 Python 内置枚举模块 enum 的讲解。

注解:枚举成员名称的大小写
因为枚举是用来表示常量的,因此,枚举成员名称建议使用大写字母,本文的示例将采用此种风格。

模块内容

enum 模块定义了四个枚举类,用来定义名称与值的唯一组合:EnumIntEnumFlagIntFlag。此外,还定义了一个装饰器 unique() 和一个辅助类 auto

  • class enum.Enum:创建枚举常量的基类。
  • class enum.IntEnum:创建 int 子类枚举常量的基类。
  • class enum.Flag:创建可与位运算符搭配使用,而又不失去 Flag 成员资格的枚举常量的基类。
  • class enum.IntFlag:创建可与位运算符搭配使用,而又不失去 IntFlag 成员资格的枚举常量的基类。
  • enum.unique()Enum 类的装饰器,确保一个名称只绑定一个值。
  • class enum.auto:用合适的值代替 Enum 成员的实例。初始默认值从 1 开始。

新建枚举

枚举是用 class 语法创建的,这种方式易读、易写。利用子类 Enum 定义枚举方法如下:

from enum import Enum
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

注解:Enum 成员值
成员值可以是 intstr 等。若无需设定确切值,auto 实例可以自动为成员分配合适的值。将 auto 和其它值混用需慎重。

注解:命名法

  • Color 是枚举(Enum)。
  • Color.REDColor.GREEN 等属性是枚举成员(Enum 成员),也是常量。
  • 枚举成员具有名称和值(例如 Color.RED 的名称为 REDColor.BLUE 的值为3等等)。

注解:虽然 Enumclass 语法创建,但 Enum 并不是常规的 Python 类。

属性访问

可通过名索引访问:

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> Color['RED']
<Color.RED: 1>
>>> Color['GREEN']
<Color.GREEN: 2>
>>> Color['BLUE']
<Color.BLUE: 3>

可通过值索引访问:

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> Color(1)
<Color.RED: 1>
>>> Color(2)
<Color.GREEN: 2>
>>> Color(3)
<Color.BLUE: 3>

如果你有一个枚举成员,可得到它的 name 和 value:

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> member = Color.RED
>>> member.name
'RED'
>>> member.value
1

重复问题

两个枚举成员的名称不能相同:(弹出异常)

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     RED = 2
...
Traceback (most recent call last):
...
TypeError: Attempted to reuse key: 'RED

但两个枚举成员的值可以相同:(不会报错)

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 1
...

确保唯一

默认情况下,枚举允许多个枚举成员具有相同的值。如需禁用此行为,可以使用装饰器 @enum.unique

>>> from enum import Enum, unique
>>> @unique
... class Color(Enum):
...     RED = 1
...     GREEN = 1
... 
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Color'>: GREEN -> RED

自动赋值

enum.auto() 函数可自动为枚举成员分配值:

>>> from enum import Enum, auto
>>> class Color(Enum):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> list(Color)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]

成员迭代

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> for item in Color:
...     print(item.name, item.value)
...
RED 1
GREEN 2
BLUE 3

比较大小

枚举成员间不允许比较大小:

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> Color.RED < Color.BLUE
Traceback (most recent call last):
...
TypeError: '<' not supported between instances of 'Color' and 'Color'

与非枚举值的比较总不相等:

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> Color.RED == 1
False

温馨提示

枚举模块 enum 在 Python3.4 版本中首次添加,3.4之前的版本使用需安装:

pip install enum

引用参考

https://docs.python.org/3/library/enum.html

  • 13
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中,enum是一个用于定义枚举类型的模块。使用enum可以更好地管理和表示一组固定的值。在Python中,可以使用标准库提供的Enum类来定义枚举类型。可以通过导入enum模块并继承Enum类来定义枚举类型。例如,可以定义一个Color枚举类,其中包含red、green和blue三个枚举值。\[1\] 此外,还可以使用IntEnum类来定义整数枚举类型。IntEnumEnum的扩展,可以用于不同类型的整数枚举之间的比较。例如,可以定义一个Shape枚举类,其中包含circle和square两个枚举值,以及一个Request枚举类,其中包含post和get两个枚举值。可以通过比较枚举值来进行判断,例如Shape.circle == 1会返回True。\[2\] 枚举类型的定义使用class语法,这种方式易读易写。可以通过定义一个继承自Enum的子类来定义枚举类型。例如,可以定义一个Color枚举类,其中包含RED、GREEN和BLUE三个枚举值。\[3\] #### 引用[.reference_title] - *1* *2* [Python学习笔记——Enum枚举)类](https://blog.csdn.net/Granery/article/details/87827565)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【Python枚举定义使用enum)](https://blog.csdn.net/qq_42951560/article/details/119542971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Xavier Jiezou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值