一、为什么要用枚举类?(思路)
平时我们写固定不变的选项(性别、月份、星期、订单状态),
以前会这样写:
MALE = 0
FEMALE = 1
但这种写法不安全、不规范、容易出错:
- 只是数字 / 字符串,没有类型限制
- 可以被随便修改
- 别人不知道这组值是干嘛的
枚举类 = 把固定常量打包成一个类,安全、规范、好维护
二、枚举类是什么?
一句话:
枚举类就是专门用来放 "固定不变的选项" 的类。
比如:性别(男 / 女)、星期(一到日)、月份(1-12)。
三、2 种创建枚举类的方法
方法 1:快速创建(自动赋值)
实例
from enum import Enum
# 格式:Enum(枚举名, (成员1, 成员2...))
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Dec'))
解析
- 自动从 1 开始编号:Jan=1,Feb=2,Mar=3...
- 不用自己写数字
- 适合简单场景
怎么用
print(Month.Jan) # 输出:Month.Jan
print(Month.Jan.value) # 输出:1
方法 2:自定义枚举(最常用、最规范)
实例
from enum import Enum, unique
@unique # 保证值不重复
class Weekday(Enum):
Sun = 0
Mon = 1
Tue = 2
Wed = 3
解析
@unique:检查重复值,有重复直接报错- 可以自己指定每个成员的值
- 工作中最常用
四、枚举类 5 种常用用法(必记)
# 1. 直接用
Weekday.Mon
# 2. 拿值
Weekday.Mon.value
# 3. 用字符串名字拿
Weekday['Mon']
# 4. 用值反查
Weekday(1)
# 5. 遍历所有成员
for name, member in Weekday.__members__.items():
print(name, member)
五、枚举类优点
- 只能用规定好的选项,不能乱填
- 代码更清晰
- 不会写错字符串、数字
- 不能被修改,安全
六、官方练习题(原题 + 解析 + 答案)
题目要求
把 Student 的 gender 改成枚举类型,避免用字符串出错。
原题代码
##代码 ✅️
# 把 Student 的 gender 改成枚举类型,避免用字符串出错。
from enum import Enum #枚举
class Gender(Enum): #必须写在Student前 因为Student类里用到了gender
male = 0
female = 1
class Student(object):
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
s1=Student('小明',12,Gender.female)
if s1.gender == Gender.female:
print('测试成功')
elif s1.gender == Gender.male:
print('测试失败')
##代码 豆包
from enum import Enum, unique
class Gender(Enum):
Male = 0
Female = 1
class Student(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
# 测试:
bart = Student('Bart', Gender.Male)
if bart.gender == Gender.Male:
print('测试通过!')
else:
print('测试失败!')
解析
- 定义
Gender枚举:男 = 0,女 = 1 Student类接收的 gender 必须是枚举值- 不能传字符串,不会出错
运行结果
测试通过!
七、练习题
练习 1:创建季节枚举
要求:
创建 Season 枚举,包含 Spring、Summer、Autumn、Winter
值分别为 1、2、3、4
打印 Summer 的值
答案
## 练习 1:创建季节枚举
# 要求:
# 创建 Season 枚举,包含 Spring、Summer、Autumn、Winter
# 值分别为 1、2、3、4
# 打印 Summer 的值
from enum import Enum, unique
@unique
# class Season(enum): ##❌️ 小写不对
class Season(Enum):
Spring = 1
Summer = 2
Autumn = 3
Winter = 4
print(Season.Summer.value)
##代码 豆包
from enum import Enum, unique
@unique
class Season(Enum):
Spring = 1
Summer = 2
Autumn = 3
Winter = 4
print(Season.Summer.value) # 输出 2
练习 2:判断枚举是否相等
创建一个枚举:
Red = 1
Green = 2
Blue = 3
判断 Color.Red 是否等于 Color(1)
答案
## 练习 2:判断枚举是否相等
# 创建一个枚举:
# Red = 1
# Green = 2
# Blue = 3
# 判断 `Color.Red` 是否等于 `Color(1)`
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
if Color.RED == Color(1):
print('测试成功')
else:
print('测试失败')
## class = 造东西的模具
## if = 马上执行的判断逻辑
##代码 豆包
from enum import Enum
class Color(Enum):
Red = 1
Green = 2
Blue = 3
print(Color.Red == Color(1)) # 输出 True
八、小结
- 枚举类 = 管理固定选项(性别、星期、状态)
- 比普通变量更安全、更规范
- 用
from enum import Enum, unique - 最常用:自定义枚举 + @unique
- 获取值:
成员.value - 按值反查:
类名(值)