網(wǎng)站首頁 Python教程 正文
前言:
一些具有特殊含義的類,其實例化對象的個數(shù)往往是固定的,比如用一個類表示月份,則該類的實例對象最多有 12 個;再比如用一個類表示季節(jié),則該類的實例化對象最多有 4 個。
針對這種特殊的類,Python 3.4 中新增加了 Enum 枚舉類。也就是說,對于這些實例化對象個數(shù)固定的類,可以用枚舉類來定義。
例如,下面程序演示了如何定義一個枚舉類:
from enum import Enum class Color(Enum): # 為序列值指定value值 red = 1 green = 2 blue = 3
如果想將一個類定義為枚舉類,只需要令其繼承自 enum 模塊中的 Enum 類即可。例如在上面程序中,Color 類繼承自 Enum 類,則證明這是一個枚舉類。
在 Color 枚舉類中,red、green、blue 都是該類的成員(可以理解為是類變量)。注意,枚舉類的每個成員都由 2 部分組成,分別為 name 和 value,其中 name 屬性值為該枚舉值的變量名(如 red),value 代表該枚舉值的序號(序號通常從 1 開始)。
和普通類的用法不同,枚舉類不能用來實例化對象,但這并不妨礙我們訪問枚舉類中的成員。訪問枚舉類成員的方式有多種,例如以 Color 枚舉類為例,
在其基礎(chǔ)上添加如下代碼:
#調(diào)用枚舉成員的 3 種方式 print(Color.red) print(Color['red']) print(Color(1)) #調(diào)取枚舉成員中的 value 和 name print(Color.red.value) print(Color.red.name) #遍歷枚舉類中所有成員的 2 種方式 for color in Color: print(color)
程序輸出結(jié)果為:
Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue
枚舉類成員之間不能比較打下,但可以用 == 或者 is 進(jìn)行比較是否相等,例如
print(Color.red == Color.green) print(Color.red.name is Color.green.name)
輸出結(jié)果為:
Flase
Flase
需要注意的是,枚舉類中各個成員的值,不能在類的外部做任何修改,也就是說,下面語法的做法是錯誤的:
Color.red = 4
除此之外,該枚舉類還提供了一個??__members__?
?屬性,該屬性是一個包含枚舉類中所有成員的字典,通過遍歷該屬性,也可以訪問枚舉類中的各個成員。
例如:
for name,member in Color.__members__.items(): print(name,"->",member)
輸出結(jié)果為:
red -> Color.red
green -> Color.green
blue -> Color.blue
值得一提的是,Python 枚舉類中各個成員必須保證 name 互不相同,但 value 可以相同
舉個例子:
from enum import Enum class Color(Enum): # 為序列值指定value值 red = 1 green = 1 blue = 3 print(Color['green'])
輸出結(jié)果為:
Color.red
可以看到,Color 枚舉類中 red 和 green 具有相同的值(都是 1),Python 允許這種情況的發(fā)生,它會將 green 當(dāng)做是 red 的別名,因此當(dāng)訪問 green 成員時,最終輸出的是 red。
在實際編程過程中,如果想避免發(fā)生這種情況,可以借助 @unique 裝飾器,這樣當(dāng)枚舉類中出現(xiàn)相同值的成員時,程序會報 ValueError 錯誤。
例如:
#引入 unique from enum import Enum,unique #添加 unique 裝飾器 @unique class Color(Enum): # 為序列值指定value值 red = 1 green = 1 blue = 3 print(Color['green'])
運行程序會報錯:
Traceback (most recent call last):
File "D:\python3.6\demo.py", line 3, in <module>
class Color(Enum):
File "D:\python3.6\lib\enum.py", line 834, in unique
(enumeration, alias_details))
ValueError: duplicate values found in <enum 'Color'>: green -> red
除了通過繼承 Enum 類的方法創(chuàng)建枚舉類,還可以使用 Enum() 函數(shù)創(chuàng)建枚舉類。
例如:
from enum import Enum #創(chuàng)建一個枚舉類 Color = Enum("Color",('red','green','blue')) #調(diào)用枚舉成員的 3 種方式 print(Color.red) print(Color['red']) print(Color(1)) #調(diào)取枚舉成員中的 value 和 name print(Color.red.value) print(Color.red.name) #遍歷枚舉類中所有成員的 2 種方式 for color in Color: print(color)
Enum() 函數(shù)可接受 2 個參數(shù),第一個用于指定枚舉類的類名,第二個參數(shù)用于指定枚舉類中的多個成員。
如上所示,僅通過一行代碼,即創(chuàng)建了一個和前面的 Color 類相同的枚舉類。
運行程序,其輸出結(jié)果為:
Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue
原文鏈接:https://blog.51cto.com/u_14246112/5293220
相關(guān)推薦
- 2024-02-27 idea中xml文件用瀏覽器打開
- 2022-07-18 Android 解決InputMethodManager 內(nèi)存泄露問題
- 2022-11-05 Swift?Extension擴(kuò)展得使用詳細(xì)介紹_Swift
- 2022-05-13 e engine “node“ is incompatible with this module.
- 2021-11-01 redux工作原理講解及使用方法_React
- 2022-07-26 pyspark中udf寫法及其使用
- 2022-08-13 【解決】訪問網(wǎng)關(guān)gateway報錯,“status“:503,“error“: “Service U
- 2022-07-11 Python中列表,元組,字典和集合的區(qū)別及它們之間的轉(zhuǎn)換_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支