为什么需要枚举

枚举(Enum)是一种数据类型,也是一种特别的类,是绑定到唯一值的符号表示,可以使用它来创建用于变量和属性的常量集枚举类可以看成是一个下拉菜单,给出特定的选项且这些选项不可修改,更贴近自然语言的方式表达数据,可以让代码更容易阅读、维护,减少转换或者错误值引起的问题,enum定义了四个类 Enum、IntEnum、Flag 和 IntFlag和一个装饰器unique()、辅助类auto

  • enum.Enum:创建枚举常量基类,即便定义int,成员也不是整型的,整型相关可以用Int相关类
  • enum.IntEnum:用于创建同时也是 int的子类的枚举型常数的基类
  • enum.IntFlag:创建可与位运算符搭配使用,成员是int的子类
  • enum.Flag:创建可与位运算符搭配使用,又不会失去 Flag成员资格的枚举常量的基类
  • 装饰器unique:确保一个名称只绑定一个值的 Enum 类装饰器
  • 辅助类auto:以合适的值代替 Enum 成员的实例。 初始值默认从 1 开始
如何使用枚举类型
通过继承enum.Enum定义一个枚举类型
import enum
# 继承Enum创建枚举类型
class Config(enum.Enum):
# 定义枚举成员常量
MAX = 1000
MIN = 10 if __name__ == '__main__':
# 获取枚举成员、值、属性
print(Config.MAX) # Config.MAX
print(Config['MAX']) # Config.MAX
print(repr(Config.MAX)) # <Config.MAX: 1000>
print(type(Config.MAX)) # <enum 'Config'>
print(Config.MAX.name) # MAX
print(Config.MAX.value) # 1000
print(Config(1000)) # Config.MAX
# 通过API定义
Config = enum.Enum('Config',{MAX:1000})
'''
第一个参数是枚举的名称
第二个参数是枚举成员的来源,可以是字符串、元组、字典
'''

我们自定义的枚举类型继承Enum基类,之后还是通过Config.MAX获取得到的是枚举成员,通过.name和.value可以获得枚举成员对应的属性

在枚举类型中定义重复的枚举成员会抛出TypeError: Attempted to reuse key异常

在类的外部通过Config.MAX = 2的方式修改,会抛出AttributeError: Cannot reassign members异常

为枚举成员添加额外属性

我们通过.name和.value访问枚举成员的定义名称和值,也可以为枚举成员添加其他属性

获取枚举成员,可以通过key获取,也可以通过value获取枚举成员

if __name__ == '__main__':
Config.MAX.msg = '最大值'
Config.MIN.msg = '最小值'
# 示例一
print(Config.MAX.msg) # 最大值
print(Config.MIN.msg) # 最小值 # 示例二
conf = Config.MAX
print(conf.msg) # 最大值 # 示例三
conf = Config(10)
print(conf.msg) # 最小值
枚举成员迭代

枚举支持按照定义顺序进行迭代

class Config(enum.Enum):
MAX = 1000
MIN = 10 if __name__ == '__main__':
for number in Config:
print(number)
'''
Config.MAX
Config.MIN
'''

特殊属性 __members__ 可以迭代从名称到成员的有序映射,包含所有美剧中定义的所有名称,包括别名

# 1.不会给出别名
print(list(Config)) # [<Config.MAX: 1000>, <Config.MIN: 10>] # 2.可以显示别名
for name,number in Config.__members__.items():
print(name,number)
unique装饰器

定义枚举时,成员名称不允许重复,但是默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名,如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员,如果我们想确保一个枚举类中的成员的值也不会重复,可以使用unique装饰器

@enum.unique
class Config(enum.Enum):
MAX = 1000
MIN = 10 '''
使用该装饰器后,如果有相同的值,会抛出ValueError: duplicate values found
'''
auto()

如果确切的值不重要,可以使用auto()生成值,值将由 _generate_next_value_() 来选择

_generate_next_value_默认是我们定义的最后一个int开始+1,如下示例,TIME的auto值则是11

_generate_next_value_可以重写,必须定义其他成员之前

class Config(enum.Enum):
MAX = 1000
MIN = 10
TIME = enum.auto() # 11
City = enum.auto() # 12 '''
自定义_generate_next_value_
'''
class Config(enum.Enum):
def _generate_next_value_(name, start, count, last_values):
return name # 返回枚举成员的名字 MAX = 1000
MIN = 10
TIME = enum.auto() # TIME
City = enum.auto() # City
比较运算
# 枚举成员按标识号进行比较

Config.MAX is Config.MAX # True
Config.MAX is Config.MIN # False
Config.MAX == Config.MAX #True #与非枚举值结果总数不相等
Config.MAX == 1000 # False
枚举类型使用事项
  • 枚举类不可实例化
  • 枚举成员是可哈希的,可以在字典和集合中使用

Python枚举类型enum的更多相关文章

  1. 人生苦短之Python枚举类型enum

    枚举类型enum是比较重要的一个数据类型,它是一种数据类型而不是数据结构,我们通常将一组常用的常数声明成枚举类型方便后续的使用.当一个变量有几种可能的取值的时候,我们将它定义为枚举类型.在Python ...

  2. python枚举类型 Enum

    在python中枚举是一种类(Enum) 枚举类中不能存在相同的标签名 枚举是可迭代的 例: from enum import Enum class Vip(Enum): MONDAY = 0 TUE ...

  3. [python] Python枚举模块enum总结

    枚举是一种数据类型,在编程中用于表示一组相关的常量.枚举中的每个常量都有一个名称和一个对应的值,可以用于增强代码的可读性和可维护性.在Python中,枚举是由enum模块提供的,而不是Python提供 ...

  4. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  5. C# 中的枚举类型 enum (属于值类型)

    原文 C# 中的枚举类型 enum (属于值类型) C# 支持两种特殊的值类型:枚举和结构. 声明枚举:声明时要声明所有可能的值. using System; using System.Collect ...

  6. 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)

    java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...

  7. 枚举类型enum详解——C语言

    enum enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶 ...

  8. 深入理解Java枚举类型(enum)

    https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...

  9. 全面解读Java中的枚举类型enum的使用

    这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...

  10. Java基础之枚举类型Enum的使用

    Java基础之枚举类型Enum的使用 定义 public enum AccruedCleanEnum { SPREAD("1","发票"),OTHER(&quo ...

随机推荐

  1. The container name "/nacos" is already in use by container

    转载请注明出处: 服务器上使用docker 安装启动 nacos 的时候,报 The container name "/nacos" is already in use by co ...

  2. springboot升级到2.6.x和2.7.x 兼容hystrix

    一.pom.xml需要引入的依赖 二.项目开启熔断器开关 2.1 注解方式 2.2 xml方式 三.依赖类缺失问题 四.版本匹配安全检查问题 五.测试验证 六.结论 一.pom.xml需要引入的依赖 ...

  3. 08-Shell计算命令

    1.expr命令 expr (evaluate expressions 的缩写),译为"表达式求值".Shell expr 是一个功能强大,并且比较复杂的命令,它除了可以实现整数计 ...

  4. 30-组合可编程逻辑器件-PLD

    组合可编程逻辑器件 1.PLD的结构 1.1 结构 1.2 表示方法 实心点表示连接,但是不可编程 ×点表示连接,但是可以编程 2.编程技术 2.1 熔丝工艺 每个输入线连接二极管和保险丝 2.2 电 ...

  5. [转帖]oracle通过pid查找执行SQL

    通过TOP 命令查看PID:1560 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1560 oracle 20 0 38.978g 0. ...

  6. [转帖]记一次sst文件损坏修复过程

    https://tidb.net/blog/54e388c8 [2023-07-14 14:26:28]应用系统报警删除数据失败,查看日志报Region is unavailable,同时企业微信群也 ...

  7. [转帖]Shell编程之免交互

    目录 交互的概念与Linux中的运用 Here Document 免交互 tee命令重定向输出加标准输出 支持变量替换 多行注释 Expect 实例操作 免交互预设值修改用户密码 创建用户并设置密码 ...

  8. 【转帖】nginx变量使用方法详解-7

    https://www.diewufeiyang.com/post/581.html   在 (一) 中我们提到过,Nginx 变量的值只有一种类型,那就是字符串,但是变量也有可能压根就不存在有意义的 ...

  9. [转帖]高性能异步io机制:io_uring

    文章目录 1.性能测试 1.1.FIO 1.2.rust_echo_benc 2.io_uring 2.1.io_uring_setup 2.2.io_uring_enter 2.3.io_uring ...

  10. [转帖]skywalking配置nacos集群模式

    版本: name version nacos 1.1.0 skywalking 6.2.0 elasticsearch 6.3.2 es集群管理工具 cerebro-0.8.3 https://git ...