为什么需要枚举

枚举(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. FileZilla 连接不上宝塔

    1,修改 pureftp的配置文件 ForcePassiveIP 为服务器的ip , 并去掉 # 2,FileZilla 使用明文连接

  2. Laravel - 配置 数据库

  3. KVM命令行Clone虚拟机的快速处理

    KVM命令行Clone虚拟机的快速处理 背景 鲲鹏+银河麒麟的测试环境 想着可以使用 KVM的方式创建虚拟机 virt-manager 有个clone虚拟机的提示, 但是发现没有创建新存储卷下面的磁盘 ...

  4. Chrony 的学习与使用

    Chrony 的学习与使用 背景 之前捯饬 ntp 发现很麻烦, 经常容易弄错了. 昨天处理文件精确时间时 想到了时间同步. 发现只有自己总结的ntpdate 但是还没有 chronyd相关的总结 本 ...

  5. 【转帖】MySQL 8.0.32如期而至

    MySQL 8.0版本计划 MySQL 8.0开始采用快速迭代开发模式,基本上是每隔3个月就发布一个新的小版本.去年1月18日(2022.1.18)发布MySQL 8.0.28,今年1月17日发布My ...

  6. [转帖]linux 磁盘队列深度nr_requests 和 queue_depth

    linux 磁盘队列深度nr_requests 和 queue_depth nr_requests 和 queue_depth 修改配置值 nr_requests 和 queue_depth 区别 i ...

  7. [转帖]Linux性能分析(二):理解CPU上下文切换

    在计算机中,上下文切换是指存储进程或线程的状态,以便以后可以还原它并从同一点恢复执行.这允许多个进程共享一个CPU,这是多任务操作系统的基本功能. Linux 是一个多任务操作系统,它支持远大于 CP ...

  8. [转帖]MIPS和ARM授权差异引起的龙芯路线变迁

    https://zhuanlan.zhihu.com/p/99807721 一.MIPS和ARM授权的异同 MIPS授权和ARM授权都分为处理器核授权(Core License)和架构授权(Archi ...

  9. [转帖]/etc/passwd文件 各个字段详解

    转载自:https://www.sohu.com/a/320177323_505901 /etc/passwd文件: 系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读 ...

  10. [转帖]Nginx四层负载均衡详解

    https://developer.aliyun.com/article/885599?spm=a2c6h.24874632.expert-profile.315.7c46cfe9h5DxWK 202 ...