枚举其实本质上是一种映射,为了知足对分类的可读性,在数据库中分类的存储通常为数字编号,而直接使用数字编号在代码中可阅读性太差,而后就产生了枚举类型python
枚举类没有出现以前,则经过变量、字典和类的方式定义枚举类数据库
1. 变量方式定义枚举设计模式
# 男 SQL_MALE = 0 # 女 SQL_FEMALE = 1
2. 字典方式定义枚举编码
SQL_SEX = {'MALE': 0, 'FEMALE': 1}
3. 类方式定义枚举spa
class Sql: MALE = 0 FEMALE = 1 print(Sql.MALE)
# 都很好解决了枚举需求,但都有可变、没有防止相同标签的缺陷设计
那,枚举须要的特性有哪些?code
1. 不能更改blog
2. 不能有相同类型的标签继承
3. 对应的数值相同,下面的类型标签至关于别名生命周期
枚举模块 enum
import enum class Course(enum.Enum): PYTHON = 0 GO = 1 C = 2 JAVA = 3 course_type = Course.PYTHON
# 只输出类型,而不是类型对应的值 print(course_type)
对枚举类有哪些相关操做
1. 遍历枚举类
import enum class Course(enum.Enum): PYTHON = 0 GO = 1 C = 2 JAVA = 3 for Type in Course: print(Type)
2. 取枚举类型名和枚举类型值
import enum class Course(enum.Enum): PYTHON = 0 GO = 1 C = 2 JAVA = 3 # 取名字 enum_name = Course.PYTHON.name # 取值 enum_value = Course.PYTHON.value print(type(enum_name), enum_name) print(type(enum_value), enum_value)
3. 枚举间只能 == 和 is 关系运算
import enum class Course(enum.Enum): PYTHON = 0 BEI_MEN_CHUI_XUE = 0 GO = 1 C = 2 JAVA = 3 print(Course.PYTHON is Course.BEI_MEN_CHUI_XUE) print(Course.PYTHON == Course.BEI_MEN_CHUI_XUE)
4. 把 value 如 0 1 等转换为枚举类型
import enum class Course(enum.Enum): PYTHON = 0 BEI_MEN_CHUI_XUE = 0 GO = 1 C = 2 JAVA = 3 value = 0 enum_type = Course(value) print(enum_type, type(enum_type))
5. 限制枚举类型中类型对应的值只能是int类型,须要继承enum中的IntEnum
import enum class Course(enum.IntEnum): PYTHON = 0 BEI_MEN_CHUI_XUE = 0 GO = 1 C = 2 JAVA = 3
6. 限制枚举类型中不能有相同的对应的值,须要经过装饰器 unique装饰枚举类
import enum @enum.unique class Course(enum.IntEnum): PYTHON = 0 GO = 1 C = 2 JAVA = 3 print(Course.PYTHON)
经验:
1. 枚举类型本质上是为了解决数字编号到代码中的可读性问题,通常用于数据库存储使用
2. 枚举类型是设计模式中的单例设计模式,不能实例化
经验关于设计模式:
1. 设计模式不能解决代码混乱问题,设计模式解决的是需求变化的频繁致使代码更改频繁的一种思路
2. 设计模式虽然颇有优点,自己最重要的仍是团队的规范和能力认识问题,须要花费很是大的时间成本和须要很是优秀的技术人员(2到3年的编码经验)
3. 设计模式还须要考量项目的生命周期,若是是大项目能够考虑设计模式,小项目就没必要了,综合考量时间成本和技术能力选择是否使用设计模式
4. 代码的可读性永远放在第一位!代码的可读性永远放在第一位!代码的可读性永远放在第一位!重要的事情说3遍