python学习笔记 | 11.5、面向对象高级编程-使用枚举类

一、为什么要用枚举类?(思路)

平时我们写固定不变的选项(性别、月份、星期、订单状态),

以前会这样写:

复制代码
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)

五、枚举类优点

  1. 只能用规定好的选项,不能乱填
  2. 代码更清晰
  3. 不会写错字符串、数字
  4. 不能被修改,安全

六、官方练习题(原题 + 解析 + 答案)

题目要求

把 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

八、小结

  1. 枚举类 = 管理固定选项(性别、星期、状态)
  2. 比普通变量更安全、更规范
  3. from enum import Enum, unique
  4. 最常用:自定义枚举 + @unique
  5. 获取值:成员.value
  6. 按值反查:类名(值)
相关推荐
傻啦嘿哟3 小时前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
迷迭香yy4 小时前
集合竞价数据挖掘实战:用Python构建开盘信号识别系统
人工智能·python·数据挖掘
风曦Kisaki5 小时前
Kubernetes(K8s)笔记Day06: 持久化存储(emptyDir,hostPath,NFS),PV 和 PVC,StorageClass存储类
linux·运维·笔记·云原生·容器·kubernetes
李昊哲小课6 小时前
fastapi sse websocket 奶茶店实时订单看板
人工智能·python·websocket·网络协议·fastapi·sse
2401_844582958 小时前
工具包:软件架构设计的实用技巧与经验分享
python
咸鱼翻身小阿橙8 小时前
现在这个四通道出现的问题
学习
RFID固定资产管理系统9 小时前
适配媒体行业的固定资产管理软件有哪些功能与核心优势
大数据·人工智能·python·媒体
SunnyDays10119 小时前
Python 为 PowerPoint 添加动画:进入、退出、动作路径与文本动画(详解)
python·powerpoint·动画·动画效果·文本动画
wgego10 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
云贝教育-郑老师10 小时前
OceanBase 是如何搞定海量数据分片(Sharding)的?
学习·oceanbase·dba