介绍

enum是一个用来枚举的模块

创建枚举类型

import enum

# 创建一个类,继承自enum下的Enum
class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = 6 # 下面便可以通过名称直接获取成员
print(Color["red"], type(Color["red"])) # Color.red <enum 'Color'>
print(Color.red, type(Color.red)) # Color.red <enum 'Color'>
# 打印的是<enum 'Color'>类型 # 那么如何获取里面的值呢?
# 调用name获取名称,调用value获取值
print(Color.red.name, type(Color.red.name)) # red <class 'str'>
print(Color.red.value) # 1 # 也可以通过迭代来获取值
for c in Color:
print(c.name, c.value)
"""
red 1
green 2
blue 3
yellow 4
pink 5
cyan 6
"""

名称或者值相同

import enum

# 如果我定义了重复的key(仮)
try:
class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = 6 cyan = 5 except Exception as e:
print(e) # Attempted to reuse key: 'cyan' # 提示我们key重复了
import enum

# 如果我定义了重复的value(仮)
class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = 6 purple = 6 # 这是通过value来获取成员
# 获取成员可以通过Color.key | Color[key]的方式,还可以使用Color(value)的方式
print(Color(6).name) # cyan
print(Color.purple.name) # cyan
# 可以看到只打印了cyan
# 如果值相同的话,那么后者相当于前者的别名,两者指向的内容是一样的 for c in Color:
print(c)
"""
Color.red
Color.green
Color.blue
Color.yellow
Color.pink
Color.cyan
"""
# purple依旧没有打印 # 那如果我就想把值相同的也打印出来,要怎么做呢?
# 枚举内部有一个__members__属性,相当于一个字典
for c in Color.__members__.items():
print(c[0], c[1])
"""
red Color.red
green Color.green
blue Color.blue
yellow Color.yellow
pink Color.pink
cyan Color.cyan
purple Color.cyan
"""
# 第一个元素是key,str类型。第二个元素是枚举类型。
# 可以看到最后一个,即便key是purple,但是对应的枚举类型依旧是Color.cyan
for c in Color.__members__.items():
print(c[0], c[1], c[1].name, c[1].value)
"""
red Color.red red 1
green Color.green green 2
blue Color.blue blue 3
yellow Color.yellow yellow 4
pink Color.pink pink 5
cyan Color.cyan cyan 6
purple Color.cyan cyan 6
"""
# 最后一个打印的仍是cyan # 成员之前也可以进行比较,但只支持is和==操作符,不支持大小比较
print(Color.green is Color.red) # False
print(Color.green is Color.green) # True
print(Color.cyan is Color.purple) # True
print(Color.cyan == Color.purple) # True

成员的值是否可变

import enum

class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = 6 purple = 6 try:
Color.red.name = "xxx"
except Exception as e:
print(e) # can't set attribute try:
Color.red.value = "xxx"
except Exception as e:
print(e) # can't set attribute # 可以看到是无法赋值的
import enum

class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = [] purple = [] print(Color.cyan is Color.purple) # True
Color.cyan.value.append(123)
print(Color.cyan is Color.purple) # True
"""
可以看到,尽管无法重新赋值,但是本地修改还是可以的,如果是可变类型的话
但是两个还是一样的,因为purple是cyan的别名,当在创建这个类的时候,由于都是空列表,所以认为两者是一样
因此当我对cyan.value进行append的时候,会影响purple
""" print(Color.cyan.value) # [123]
print(Color.purple.value) # [123] Color.purple.value.append(456) # 通过反过来也是一样的
print(Color.cyan.value) # [123, 456]
print(Color.purple.value) # [123, 456]

强制让成员的值不一样

枚举类,key重复是不允许的,但是值重复是可以的,可如果我也不允许值重复呢?只需要加上一个装饰器即可

import enum

try:
@enum.unique
class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = [] purple = [] except Exception as e:
print(e) # duplicate values found in <enum 'Color'>: purple -> cyan # 提示我们purple和cyan的value重复了

比较成员的值

之前说过,枚举成员是不支持大小比较的,但如果我想支持呢?

import enum

# 换一种继承的类,改成IntEnum
class Color(enum.IntEnum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = "6" # 此时里面的成员要是int类型,或者能将字符串转成int print(Color.red < Color.blue) # True
print(Color.red + Color.cyan) # 7

enum:python实现枚举也很优雅的更多相关文章

  1. Python 的枚举 Enum

    枚举是常用的功能,看看Python的枚举. from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May' ...

  2. 别再说Python没有枚举类型了,好好看看

    枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. Python 的原生类型(Built-in types)里并没有专门的枚举类型,但是我们可以通 ...

  3. python基础——枚举类

    python基础——枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单 ...

  4. python代码如何写的优雅?

    简介 在实际项目中,我们可能一开始为了完成功能而忽视了代码的整体质量,因此,使用一些高阶的函数或方法,能够更加使我们的代码更加优雅.废话不多说,现在马上开始. 使用enumerate方法替代range ...

  5. 使用Enum.TryParse()实现枚举的安全转换

    在项目中,有时候会用到领域枚举和DTO枚举的映射和转换.有一个现实的问题是:如果领域枚举项发生变化,而DTO枚举项没有及时更新,这样会造成映射不上的问题.那么,如何避免此类问题呢? 先看领域枚举和DT ...

  6. Java分享笔记:自定义枚举类 & 使用enum关键字定义枚举类

    在JDK1.5之前没有enum关键字,如果想使用枚举类,程序员需要根据Java语言的规则自行设计.从JDK1.5开始,Java语言添加了enum关键字,可以通过该关键字方便地定义枚举类.这种枚举类有自 ...

  7. python:枚举类型

    1.什么是枚举类型? 枚举类型可以看做是一系列常量的集合,通常用于表示某些有限且固定的集合,例如月份(一年有12个月).星期(一星期有七天).季节(一年四个季节)等. 2.枚举的定义 定义枚举首先要导 ...

  8. Python面向对象-枚举类型enum

    枚举类型:在实际问题中,有些变量的值被限定在一个有限的范围内.例如:一个星期有且只有7天,一年有且只有十二个月,一个班每周有6门课程等等.如果把这些量说明为整型.字符串或者其他类型显然是不合适.编程界 ...

  9. Python 的枚举类型

    起步 Python 中的枚举类型 Python 的原生类型中并不包含枚举类型.为了提供更好的解决方案,Python 通过 PEP 435 在 3.4 版本中添加了 enum 标准库. 枚举类型可以看作 ...

随机推荐

  1. The inherit, initial, and unset values

    The  inherit, initial, and unset keywords are special values you can give to any CSS property. Tests ...

  2. 六十三:CSRF攻击与防御之系统准备之登录与转账功能

    登录功能 在forms里面添加验证 class LoginForm(Form): email = StringField(validators=[Email(message='邮箱格式错误')]) p ...

  3. LoadRunner脚本编写之一

    LoadRunner脚本编写之一 性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不 ...

  4. 根据XML文件 生成 java类

    最近一直在做关于webservice 的项目,这种项目最麻烦的就是根据对方的要求产生XML,文档里面虽然有XML结构,但是要转化为java里面的实体实在费劲, 有个自动化的工具就好了,半自动化也好,省 ...

  5. MySQL使用order by field()自定义排序

    MySQL的自定义排序和Oracle相比,要简单得多. 假设在表v_education的列schoolRecord中,有以下字段:'小学','初中','高中','专科','本科','硕士','博士'. ...

  6. Python web 项目的依赖管理工具

    Poetry可以帮助你声明.管理和安装Python项目的依赖项,确保你可以在任何地方都拥有正确的堆栈. Poetry支持Python 2.7 和Python 3以上 安装 Poetry提供了一个自定义 ...

  7. python批量执行shell命令

    [root@master ~]# cat a.py #!/usr/bin/python # -*- coding:UTF- -*- import subprocess def fun(): subpr ...

  8. 参考:菜菜的sklearn教学之降维算法.pdf!!

    PCA(主成分分析法) 1. PCA(最大化方差定义或者最小化投影误差定义)是一种无监督算法,也就是我们不需要标签也能对数据做降维,这就使得其应用范围更加广泛了.那么PCA的核心思想是什么呢? 例如D ...

  9. vscode 中sftp配置

    简单记录一下,相对路径的设置不用“/”表明根目录等,直接写目录名字即可 {     "name": "profile name",     "prot ...

  10. 前端vscode常用插件

    Auto Rename Tag 这是一个html标签的插件,可以让你修改一边标签,另外一边自动改变. Beautify 格式化代码插件 Braket Pair Colorizer 给js文件中的每一个 ...