Python 枚举类型

Python 枚举类型语法

在实际开发中,有些变量只有几种可能的取值。比如人的性别只有 2 种值:'男' 和 '女',而星期几只有 7 种值:1、2、3、4、5、6、7。

在 Python 中,我们可以使用 enum 模块的 Enum 类或 IntEnum 类来实现枚举类型,从而使得可以限制该变量在某个范围内取值。

语法:

from enum import Enum
class 类名 (Enum):
    成员名1 = 值1
    成员名2 = 值2
    ……
    成员名n = 值n

说明:

Python 中的枚举本质上是一个,需要先从 enum 模块导入该类,然后再使用继承的方式来自定义一个枚举类。

对于枚举类型,小伙伴们需要清楚以下 3 点。

  • 由于枚举都是用来代表常量,因此枚举成员名应该采用纯大写。
  • 如果是继承 Enum 类,则枚举值可以是整型或字符串。如果是继承 IntEnum 类,则枚举值只能是整型。
  • 枚举成员有 2 个属性:name 和 value。name 属性用于获取成员名,而 value 属性用于获取成员值。

Python 枚举类型示例

接下来,我们通过几个简单的例子来讲解 Python 中的枚举类型是如何使用的。

示例 1:枚举类型的基本用法

from enum import Enum

# 定义枚举类
class Gender(Enum):
    MALE = 0
    FEMALE = 1

# 打印枚举类型
print(Gender.MALE)
print(Gender.FEMALE)

# 打印枚举名
print(Gender.MALE.name)
print(Gender.FEMALE.name)

# 打印枚举值
print(Gender.MALE.value)
print(Gender.FEMALE.value)

运行结果如下。

Gender.MALE
Gender.FEMALE
MALE
FEMALE
0
1

分析:

直接打印枚举类型(如 print(Gender.MALE)),得到的是一个枚举类型。如果想要获取枚举名,需要使用 name 属性;如果想要获取枚举值,需要使用 value 属性。

下面再多举几个枚举类,以便小伙伴们更好地了解 Python 枚举类型是如何定义的。

# 星期几
from enum import Enum
class Weekday(Enum):
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3
    THURSDAY = 4
    FRIDAY = 5
    SATURDAY = 6
    SUNDAY = 7

# RGB 三原色
from enum import Enum
class Color(Enum):
    RED = 'red'
    GREEN = 'green'
    BLUE = 'blue'

示例 2:枚举的别名

from enum import Enum

# 定义枚举类
class Gender(Enum):
    MALE = 0
    FEMALE = 1
    MALE_ALIAS = 0

print(Gender.MALE)
print(Gender.MALE_ALIAS)

print(Gender.MALE.name)
print(Gender.MALE_ALIAS.name)

print(Gender.MALE.value)
print(Gender.MALE_ALIAS.value)

运行结果如下。

Gender.MALE
Gender.MALE
MALE
MALE
0
0

分析:

在定义枚举类型时,如果两个枚举名不同但枚举值相同,那么后者是前者的别名。

注意: 如果有多个成员的值相同,那么第二个成员会被当做第一个成员的别名。然后使用 for 循环遍历枚举时,这些别名是不会被打印出来的,只会打印真正的那个成员。

示例 3:遍历枚举

from enum import Enum

# 定义枚举类
class Gender(Enum):
    MALE = 0
    FEMALE = 1

# 遍历枚举
for member in Gender.__members__:
    print(member)

运行结果如下。

MALE
FEMALE

分析:

如果想要遍历枚举,可以使用 “for 循环” 结合 “__members__属性” 来实现。

提示: 更多关于 Python 枚举类型的信息,请参考官方文档:Enum HOWTO

上一篇: Python with 语句

下一篇: Python 多线程

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号