枚舉其實本質上是一種映射,爲了知足對分類的可讀性,在數據庫中分類的存儲通常爲數字編號,而直接使用數字編號在代碼中可閱讀性太差,而後就產生了枚舉類型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遍