小白学 Python
课程GitHub
© 2026 小白学 Python · 基于 walter201230/Python 教程
课程目录GitHub
Python 环境加载中…
枚举类0 / 4
1234

枚举类

4 道练习题·预计 30 分钟·做对一题解锁下一段

教学 01 / 05· 已读

第十节:枚举类

这一节学的是 枚举类(Enum)——一种用来 代替魔法常量 的语法工具。

本节脉络

  • 一、为什么要用枚举(取代散落的常量)
  • 二、Enum 基本用法
  • 三、自定义类型 / @unique / auto()
  • 四、枚举的比较:== / is / IntEnum
教学 02 / 05· 已读

一、为什么要用枚举

实际开发里,我们经常会遇到「几个固定的、有限的取值」这种场景:

  • 月份:1~12
  • 星期:周一~周日
  • 订单状态:待支付 / 已支付 / 已发货 / 已完成 / 已取消
  • 颜色:红 / 绿 / 蓝

最朴素的写法是用一组大写常量:

python
JAN = 1
FEB = 2
MAR = 3
# ...
NOV = 11
DEC = 12

简单快捷,但有三个缺点:

  1. 类型太松——JAN 只是一个 int,谁都可以拿别的整数来冒充:def show_month(m),调用方传进来 m = 99,函数也没办法知道这是不是一个合法的月份。
  2. 散落各处——常量分散在文件里,没有「这一组属于一类」的语义。
  3. 可被修改——它就是变量,JAN = 100 也不会报错。

更好的做法是 定义一个 class,每个常量都是 class 里唯一的实例。

Python 标准库的 enum 模块就是干这个的。看看效果:

python
from enum import Enum

class Month(Enum):
    JAN = 1
    FEB = 2
    MAR = 3
    # ...
    DEC = 12

print(Month.JAN)        # Month.JAN
print(Month.JAN.name)   # 'JAN'
print(Month.JAN.value)  # 1

跟普通常量比,Enum 的好处:

  • 类型清晰:Month.JAN 的类型就是 Month,传错参数立刻看出来
  • 不可修改:Month.JAN = 999 会直接报错
  • 不可实例化:Month() 不会创造新成员,所有成员都是 单例
  • 可迭代:for m in Month: ... 直接拿到所有成员

Enum 的成员均为 单例(Singleton),并且 不可实例化、不可更改。

教学 03 / 05

二、Enum 基本用法

1、定义一个 Enum

最常见的写法是 继承 Enum 类:

python
from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

Color 本身是一个 类,Color.RED / Color.GREEN / Color.BLUE 是它的三个 成员。

2、访问成员

python
print(Color.RED)         # Color.RED        ← 默认 repr
print(Color.RED.name)    # 'RED'            ← 成员名
print(Color.RED.value)   # 1                ← 对应的值

记住两个属性:

  • .name —— 成员的 名字(字符串)
  • .value —— 成员的 值(任意类型)

3、遍历所有成员

Enum 是可迭代的:

python
for c in Color:
    print(c.name, c.value)

输出:

RED 1
GREEN 2
BLUE 3

也可以用 __members__ 拿到一个 有序映射(包含别名):

python
for name, member in Color.__members__.items():
    print(name, '->', member, '->', member.value)

4、另一种创建方式(函数式)

不写 class,直接用 Enum(...) 函数:

python
from enum import Enum

Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                       'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

print(Month.Jan)        # Month.Jan
print(Month.Jan.value)  # 1,从 1 开始自动分配

第一个参数是类名,第二个参数是成员名的可迭代对象。这种写法适合「成员只是一组名字、不在乎具体的值」的场景。

推荐 优先用 class 写法——明确、可读、IDE 提示更友好。函数式写法只在需要动态生成 Enum 时才用。

练习 1 / 4·定义一个 Color 枚举类题目有问题?

请用 from···import 从 enum 模块导入 Enum,然后:

  1. 定义一个继承 Enum 的类 Color,包含三个成员:
    • RED = 1
    • GREEN = 2
    • BLUE = 3
  2. print(Color.RED)

输出应该是:

Color.RED

提示:直接 print 一个 Enum 成员,默认会打出 类名.成员名 这种格式。

main.py
可编辑
🔒做对当前题解锁下一段 ·0/4
本章目录

枚举类

  1. 教学 01第十节:枚举类
  2. 教学 02一、为什么要用枚举
  3. 教学 03二、Enum 基本用法
  4. 练习 1定义一个 Color 枚举类
  5. 练习 2 🔒访问 .name 和 .value
  6. 练习 3 🔒遍历 Enum 的所有成员
  7. 教学 04三、自定义类型、@unique、auto()
  8. 练习 4 🔒用 auto() 自动分配值
  9. 教学 05四、枚举的比较
← 上一章10 · 魔法方法
枚举类
下一章 →12 · 元类 metaclass