为什么需要枚举

枚举(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. 怎样实现WPF Prism Module的国际化和本地化?

    怎样实现WPF Prism Module的国际化和本地化? English | 简体中文 上一篇有简单介绍主工程的国际化,使用的资源字典(XAML)实现的. 这几天我添加了几个Prism模块(Modu ...

  2. win11不改时区,安装 android 子系统,运行android app

    win11开启虚拟机平台 下载安卓子系统 打开https://store.rg-adguard.net , 在URL中输入:https://www.microsoft.com/store/produc ...

  3. Java进程内线程数量限制的相关学习

    Java进程内线程数量限制的相关学习 背景 还是之前出现 cannot create native thread 的问题的后续 周末在家学习了下如何在容器外抓取dump. 也验证了下能否开启超过宿主机 ...

  4. [转帖]InfluxDB 修改数据存储路径

    1.创建数据存储目录 mkdir -p /home/data/influxdb 说明:目录可以根据实际情况进行修改. 2.设置目录访问权限 sudo chown influxdb.influxdb / ...

  5. [转帖]TIDB - TIDB集群的扩容和缩容及TIUP指令说明

    一.TIUP工具简介 前面介绍了使用TIUP搭建TIDB集群,本篇文章详细介绍下使用TIUP对集群进行扩容和缩容. 在面对双十一这种流量突峰的场景,我们平常的TIDB集群有可能承受不住,因此需要提前进 ...

  6. [转帖]性能测试工具netperf安装使用

    https://blog.51cto.com/dingtongxue1990/1853714 netperf工具使用 一.安装 1,下载 liunx下载地址:ftp://ftp.netperf.org ...

  7. [转帖]JVM NativeMemoryTracking ;jcmd process_id VM.native_memory;Native memory tracking is not enabled

    目录 一.Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能.我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据. 1.N ...

  8. 如何写RN样式 如何写RN组件 如何满屏 如何使用变量

    app.js 文本水平居中了哈 控制文本的大小 字体颜色等 只有在文本元素上去控制哈 import React from 'react'; import {View, Text, StyleSheet ...

  9. (数据科学学习手札76)基于Python的拐点检测——以新冠肺炎疫情数据为例

    本文对应代码.数据及文献资料已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes,对代码不感兴趣的朋友可以直接跳至2.2 探 ...

  10. 解决:VScode中 import 后出现no module的问题

    问题: ModuleNotFoundError: No module named 'xxx' 除去没有安装包的问题 这个问题还是挺难受的,pycharm和终端都可以运行,只有vscode报错 方法一: ...