一文带你了解Python枚举类enum的使用
作者:XerCis 发布时间:2022-05-27 07:46:51
标签:Python,枚举类,enum
简介
枚举是与多个唯一常量绑定的一组符号
因为枚举表示的是常量,建议枚举成员名用大写
IntEnum 便于进行系统交互
初试
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
print(Color.RED) # Color.RED
print(repr(Color.RED)) # <Color.RED: 1>
print(type(Color.RED)) # <enum 'Color'>
print(isinstance(Color.GREEN, Color)) # True
print(Color.RED.name) # RED
遍历
from enum import Enum
class Shake(Enum):
VANILLA = 7
CHOCOLATE = 4
COOKIES = 9
MINT = 3
for shake in Shake:
print(shake)
# Shake.VANILLA
# Shake.CHOCOLATE
# Shake.COOKIES
# Shake.MINT
__members__ 列出 name 和成员
from enum import Enum
class Shape(Enum):
SQUARE = 2
DIAMOND = 1
CIRCLE = 3
ALIAS_FOR_SQUARE = 2
for name, member in Shape.__members__.items():
print(name, member)
# SQUARE Shape.SQUARE
# DIAMOND Shape.DIAMOND
# CIRCLE Shape.CIRCLE
# ALIAS_FOR_SQUARE Shape.SQUARE
可哈希
枚举成员可哈希,可用于字典和集合
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
apples = {}
apples[Color.RED] = 'red delicious'
apples[Color.GREEN] = 'granny smith'
print(apples)
# {<Color.RED: 1>: 'red delicious', <Color.GREEN: 2>: 'granny smith'}
访问成员
name:变量名
value:值
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
# 通过值访问
print(Color(1)) # Color.RED
print(Color(3)) # Color.BLUE
# 通过name访问
print(Color['RED']) # Color.RED
print(Color['GREEN']) # Color.GREEN
# 访问成员的name或value
print(Color.RED.name) # RED
print(Color.RED.value) # 1
唯一枚举值
装饰器 @unique
from enum import Enum, unique
@unique
class Mistake(Enum):
ONE = 1
TWO = 2
THREE = 3
FOUR = 3
# ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
自动枚举值
如果枚举值不重要,可以用 auto(), 默认从 1 开始
from enum import Enum, auto
class Color(Enum):
RED = auto()
BLUE = auto()
GREEN = auto()
print(Color(1)) # Color.RED
print(list(Color)) # [<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]
比较运算
Enum 不支持直接排序
IntEnum 可直接排序
Enum
from enum import Enum
class Color(Enum):
RED = 1
BLUE = 2
GREEN = 3
print(Color.RED is Color.RED) # True
print(Color.RED is Color.BLUE) # False
print(Color.RED is not Color.BLUE) # True
try:
Color.RED < Color.BLUE # Enum不支持直接排序
except Exception as e:
print(e) # '<' not supported between instances of 'Color' and 'Color'
print(Color.BLUE == Color.RED) # Fasle
print(Color.BLUE != Color.RED) # True
print(Color.BLUE == Color.BLUE) # True
print(Color.BLUE == 2) # False
IntEnum
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
GREEN = 3
# IntEnum可直接排序
print(Color.RED < Color.BLUE) # True
print(Color.BLUE == 2) # True
功能性API
官方教程
from enum import Enum
class Animal(Enum):
ANT = 1
BEE = 2
CAT = 3
DOG = 4
Animal = Enum('Animal', 'ANT BEE CAT DOG') # 同上
print(Animal) # <enum 'Animal'>
print(Animal.ANT) # <Animal.ANT: 1>
print(Animal.ANT.value) # 1
print(list(Animal)) # [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
IntEnum
官方教程
除了不可以直接和 Enum 比较,其他都类似整数
from enum import Enum, IntEnum
class Color(Enum):
RED = 1
GREEN = 2
class Shape(IntEnum):
CIRCLE = 1
SQUARE = 2
class Request(IntEnum):
POST = 1
GET = 2
print(Shape.CIRCLE == Color.RED) # False
print(Shape == 1) # False
print(Shape.CIRCLE == 1) # True
print(Shape.CIRCLE == Request.POST) # True
print(int(Shape.CIRCLE)) # 1
print(['a', 'b', 'c'][Shape.CIRCLE]) # b
print([i for i in range(Shape.SQUARE)]) # [0, 1]
IntFlag
官方教程
类似 int,IntFlag 成员使用按位运算符得到的结果仍然是 IntFlag 成员
IntFlag 和 Enum 的一个区别在于,如果没有设置任何标志(值为 0),则其布尔值为 False
from enum import IntFlag
class Perm(IntFlag):
R = 4 # 读
W = 2 # 写
X = 1 # 执行
print(Perm.R | Perm.W) # <Perm.R|W: 6>
print(Perm.R + Perm.W) # 6
RW = Perm.R | Perm.W
print(Perm.R in RW) # True
from enum import IntFlag
class Perm(IntFlag):
R = 4 # 读
W = 2 # 写
X = 1 # 执行
RWX = 7 # 读写执行
print(Perm.RWX) # <Perm.RWX: 7>
print(~Perm.RWX) # <Perm.-8: -8>
print(Perm.R & Perm.X) # <Perm.0: 0>
print(bool(Perm.R & Perm.X)) # False
print(Perm.X | 8) # <Perm.8|X: 9>
Flag
官方教程
Flag 与 IntFlag 类似,成员可使用按位运算符进行组合,但不可与其他 Flag 或 int 组合
推荐用 auto() 作为值
from enum import Flag, auto
class Color(Flag):
BLACK = 0
RED = auto()
BLUE = auto()
GREEN = auto()
WHITE = RED | BLUE | GREEN
print(Color.RED & Color.GREEN) # <Color.0: 0>
print(bool(Color.RED & Color.GREEN)) # False
print(Color.WHITE) # <Color.WHITE: 7>
print(Color.BLACK) # <Color.BLACK: 0>
print(bool(Color.BLACK)) # False
知识点
不支持同名
来源:https://blog.csdn.net/lly1122334/article/details/127528887


猜你喜欢
- pytorch中我们有时候可能需要设定某些变量是参与训练的,这时候就需要查看哪些是可训练参数,以确定这些设置是成功的。pytorch中mod
- 有一台windows服务器上跑着mysql的一些应用,现在需要将mysql的数据每天备份,并通过ftp上传到指定的存储服务器上要是在linu
- 在许多网页中,当鼠标移到一张图片上时,又弹出另一张图片,做这种广告条,要用到Macromedia DreamWeaver中的Lay
- eclare @str nvarchar(50);set @str='462,464,2';select @str as &
- 前端使用ajax进行数据交互时:$.ajax({ cache: false, type: "POST", url: {%
- 随着因特网的发展,在网络环境中,数据库应用渐渐向操作简单、功能实用的方向发展。本文介绍如何利用ASP技术实现对数据库进行在线维护的方法,并给
- 使用File实现文件上传使用Form表单上传文件,fastapi使用File获取上传的文件。指定了参数类型是bytes:file: byte
- 第一、几种常用方法读取TXT文档:urlopen()读取PDF文档:pdfminer3k第二、乱码问题(1)、from urllib.req
- 学习了vue.js一段时间,拿它来做2个小组件,练习一下。我这边是用webpack进行打包,也算熟悉一下它的运用。源码放在文末的 githu
- 本文实例讲述了python判断字符串是否纯数字的方法。分享给大家供大家参考。具体如下:判断的代码如下,通过异常判断不能区分前面带正负号的区别
- 我们来看看MD5加密码的实现:注意看一下他数据库里的加密位数!先在通用处申明:Private Const BITS_TO
- 本文性别判断主要依靠airtest中的自动化测试实现通过自动对比支付宝页面男女图像,从而实现男女判断代码如下:男女判断函数:// An hi
- 代码很简洁,也很简单,就不多废话了。/** * 去除多余的0 */ function del0($s)&
- MySQL使用环境变量TMPDIR的值作为保存临时文件的目录的路径名。如果未设置TMPDIR,MySQL将使用系统的默认值,通常为/tmp、
- 下面的教程总结了Javascript在网页定位方面的相关知识。一、网页的绝对大小和相对大小首先,要明确两个基本概念。一张网页的全部面积,就是
- python整数序列求和整数序列求和,用户输入一个正整数N,计算从1到N(包含1和N)相加之后的结果。代码如下:n=input("
- 什么是typescripttypescript 为 javaScript的超集,这意味着它支持所有都JavaScript都语法。它很像Jav
- 前言 MySQL 5.5版本之前默认的复制是异步(Asynchronous )模式的, MySQL 5
- 3. 品味“决定”艺术作品的好坏,设计的好坏则来自主观意见我们在鉴赏艺术作品时,用看法来表达当时的感觉,而你的品味则会左右你的看法。以一个有
- 通常说到外键,只会提到“外键的目的是确定资料的参考完整性(referential integrity)。”,但是外键具体包含哪些动作和含义呢