enum:python实现枚举也很优雅
介绍
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实现枚举也很优雅的更多相关文章
- Python 的枚举 Enum
枚举是常用的功能,看看Python的枚举. from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May' ...
- 别再说Python没有枚举类型了,好好看看
枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. Python 的原生类型(Built-in types)里并没有专门的枚举类型,但是我们可以通 ...
- python基础——枚举类
python基础——枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单 ...
- python代码如何写的优雅?
简介 在实际项目中,我们可能一开始为了完成功能而忽视了代码的整体质量,因此,使用一些高阶的函数或方法,能够更加使我们的代码更加优雅.废话不多说,现在马上开始. 使用enumerate方法替代range ...
- 使用Enum.TryParse()实现枚举的安全转换
在项目中,有时候会用到领域枚举和DTO枚举的映射和转换.有一个现实的问题是:如果领域枚举项发生变化,而DTO枚举项没有及时更新,这样会造成映射不上的问题.那么,如何避免此类问题呢? 先看领域枚举和DT ...
- Java分享笔记:自定义枚举类 & 使用enum关键字定义枚举类
在JDK1.5之前没有enum关键字,如果想使用枚举类,程序员需要根据Java语言的规则自行设计.从JDK1.5开始,Java语言添加了enum关键字,可以通过该关键字方便地定义枚举类.这种枚举类有自 ...
- python:枚举类型
1.什么是枚举类型? 枚举类型可以看做是一系列常量的集合,通常用于表示某些有限且固定的集合,例如月份(一年有12个月).星期(一星期有七天).季节(一年四个季节)等. 2.枚举的定义 定义枚举首先要导 ...
- Python面向对象-枚举类型enum
枚举类型:在实际问题中,有些变量的值被限定在一个有限的范围内.例如:一个星期有且只有7天,一年有且只有十二个月,一个班每周有6门课程等等.如果把这些量说明为整型.字符串或者其他类型显然是不合适.编程界 ...
- Python 的枚举类型
起步 Python 中的枚举类型 Python 的原生类型中并不包含枚举类型.为了提供更好的解决方案,Python 通过 PEP 435 在 3.4 版本中添加了 enum 标准库. 枚举类型可以看作 ...
随机推荐
- centos的KVM初级安装
什么是KVM虚拟化技术?KVM(Kernel-based Virtual Machine),主流虚拟化技术之一,集成与Linux2.6之后版本中,通过linux内核提供任务调度及管理.kvm,在实现虚 ...
- 整型,长整型,无符号整型等 大端和小端(Big endian and Little endian)
一.大端和小端的问题 对于整型.长整型.无符号整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian ...
- jmeter beanShell修改http请求参数
jmeter beanShell修改http请求参数 在使用jmeter进行测试时,需要对上一步响应的明文参数,如userName='tom' token='%sdf%sdkdfj'之类的参数,加密一 ...
- Swift3.0基础语法学习<一>
// // ViewController.swift // SwiftBasicDemo // // Created by 思 彭 on 16/11/15. // Copyright © 2016年 ...
- 获取sql server中自增量之scope_identity(),@@Identity,IDENT_CURRENT的区别
http://www.lmwlove.com/ac/ID480 在sql server2005,如果要获某个表最新增加的自增量,我们都知道,可以使用COPE_IDENTITY. IDENT_CURRE ...
- 【HANA系列】SAP HANA SLT 在表中隐藏字段并传入HANA的方法
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SLT在表中隐 ...
- Ubuntu下c程序运行原理
运行环境: 1.Vitural box下安装Ubuntu虚拟机 2.编译运行工具:gcc 3.编辑器:vim 主要过程: 1.利用vim编辑hello.c 2.编译和执行 (1)预处理阶段:使用 -E ...
- 【Linux开发】彻底释放Linux线程的资源
Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的.而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出 ...
- java将base64解析图片保存到本地。
将base64解析图片保存到本地的两个方法 /** * base64转图片 * @param base64str base64码 * @param savePath 图片路径 * @return */ ...
- NLP中的对抗样本
自然语言处理方面的研究在近几年取得了惊人的进步,深度神经网络模型已经取代了许多传统的方法.但是,当前提出的许多自然语言处理模型并不能够反映文本的多样特征.因此,许多研究者认为应该开辟新的研究方法,特别 ...