介绍

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. 使用sql developer 导出Oracle数据库中的表结构

    MS SQLServer的客户端工具做的的确比较好,直接右键,导出数据库就OK了,而且MS的客户端导出的是xxx.dbf文件,直接附加到别的数据库上就OK了 Oracle的sql developer就 ...

  2. 基于 Open vSwitch 的 OpenFlow 实践

    目录 文章目录 目录 前文列表 Open vSwitch 基本概念 Open vSwitch 与 OpenFlow 的关系 通过 Open vSwitch 实践 OpenFlow 屏蔽数据包 重定向数 ...

  3. SQL学习(六)select into:复制表信息

    在实际工作中,可能需要将一个表中的数据复制到另一个表中,以供后续使用.此时可以用关键字select into(在MySQL中不支持select into,可使用insert into...select ...

  4. SqlServer:SqlServer(数据库备份,数据文件迁移,增加数据库文件组,递归查询一周报送情况,查询近X天未报送单位,截断数据库日志,复制单个或多个数据库表到另一个数据库 )

    1.数据备份 ) ) ) )),'-','') ) SET @savePath = 'f:/DatabaseBackup/' DECLARE My_Cursor CURSOR FOR ( select ...

  5. redhat网卡设置

    在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0   开始编辑,填写ip地址.子网掩码.网关.DNS等.其中“红框内的信息”是必须得有的.   编 ...

  6. 121. 买卖股票的最佳时机( Best Time to Buy and Sell Stock)

    题目地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ 解题思路一:暴力求解法 根据题目我们可以知道,我们知道最大 ...

  7. flask 之(六) --- API|RestfulApi

    接口概念 IOP:面向接口编程,不再关注具体的实现:只关注输入.输出. http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practice ...

  8. 【C/C++】assert()函数用法总结

    assert()函数用法总结 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> ...

  9. 【DSP开发】TMS320C66x DSP SPI Nor Flash的程序烧写

    经过一段时间的研究终于把TMS320C6657单核和双核的SPI Nor Flash的程序烧写调通了.工具都是前辈的工作,有需要的可以留下邮箱,我有空可以发. 原理参考钱丰的<TI c66x 系 ...

  10. tyan 3+1+15 远程

    直接修改好BIOS,输入IP即可访问,帐号anonymous 这个登录 也就是为空,直接写入密码,登录即可