一文带你了解Python枚举类enum的使用

 更新时间:2022年10月26日 15:22:03   作者:XerCis  
枚举是与多个唯一常量绑定的一组符号,因为枚举表示的是常量,建议枚举成员名用大写 IntEnum 便于进行系统交互。本文将通过一些示例代码讲解Python枚举类的使用,需要的可以参考一下

简介

枚举是与多个唯一常量绑定的一组符号

因为枚举表示的是常量,建议枚举成员名用大写

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

知识点

不支持同名

以上就是一文带你了解Python枚举类enum的使用的详细内容,更多关于Python枚举类enum的资料请关注脚本之家其它相关文章!

相关文章

  • Python reversed函数及使用方法解析

    Python reversed函数及使用方法解析

    这篇文章主要介绍了Python reversed函数及使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python 字符串操作详情

    Python 字符串操作详情

    这篇文章主要介绍了Python 字符串操作,所谓字符串,就是由0个或者多个字符组成的有限序列,字符串的字符可以是特殊符号、英文字母、中文字符、日文的平假名或片假名、希腊字母、Emoji字符等等。下面我们大家一起来学习文章详细内容吧
    2021-11-11
  • python 切换root 执行命令的方法

    python 切换root 执行命令的方法

    今天小编就为大家分享一篇python 切换root 执行命令的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • OpenCV2学习笔记之视频流读取与处理

    OpenCV2学习笔记之视频流读取与处理

    为OpenCV是搞计算机视觉必须要掌握的基础,这篇文章主要给大家介绍了关于OpenCV2学习笔记之视频流读取与处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • Python+flask编写一个简单实用的自动排班系统

    Python+flask编写一个简单实用的自动排班系统

    这篇文章主要为大家详细介绍了如何基于Python+flask编写一个简单实用的自动排班系统,文中的示例代码讲解详细,有需要的小伙伴可以了解下
    2025-03-03
  • Python netmiko模块的使用

    Python netmiko模块的使用

    这篇文章主要介绍了Python netmiko模块的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • django authenticate用户身份认证的项目实践

    django authenticate用户身份认证的项目实践

    Django的contrib.auth模块中的authenticate()函数用于对用户的凭据进行身份验证,本文就来介绍一下django authenticate用户身份认证的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • python完成FizzBuzzWhizz问题(拉勾网面试题)示例

    python完成FizzBuzzWhizz问题(拉勾网面试题)示例

    这篇文章主要介绍了python完成FizzBuzzWhizz问题(拉勾网面试题)示例,需要的朋友可以参考下
    2014-05-05
  • OpenCV计算平均值cv::mean实例代码

    OpenCV计算平均值cv::mean实例代码

    函数cv::mean计算数组元素的平均值M,每个通道都是独立的,并返回这个平均值,这篇文章主要给大家介绍了关于OpenCV计算平均值cv::mean的相关资料,需要的朋友可以参考下
    2021-08-08
  • python 中的 super详解

    python 中的 super详解

    这篇文章主要介绍了python 中的 super,提到 super,最直接的想法就是它代表了父类,替父类执行某些方法,但是理解也仅止步于此,下面对 super 做进一步理解,需要的朋友可以参考下
    2022-08-08

最新评论