摘要:枚舉類型可以看作是一種標(biāo)簽或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期月份狀態(tài)等。
枚舉類型可以看作是一種標(biāo)簽或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、狀態(tài)等。
Python 的原生類型(Built-in types)里并沒有專門的枚舉類型,但是我們可以通過很多方法來實現(xiàn)它,例如字典、類等:
MiracleLove = {"MON": "林志玲", "TUS": "陳意涵", "WEN": "張柏芝", "THU": "辛芷蕾", "FRI": "周冬雨"} class MiracleLove: MON = "林志玲" TUS = "陳意涵" WEN = "張柏芝" THU = "辛芷蕾" FRI = "周冬雨"
上面兩種方法可以看做是簡單的枚舉類型的實現(xiàn)。
如果只在局部范圍內(nèi)用到了這樣的枚舉變量是沒有問題的。
但問題在于它們都是可變的(mutable),也就是說可以在其它地方被修改從而影響其正常使用:
MiracleLove["MON"] = MiracleLove["FRI"] print(MiracleLove)
通過類定義的枚舉甚至可以實例化,變得不倫不類:
ml = MiracleLove() print(ml.MON) MiracleLove.MON = 2 print(ml.MON)
當(dāng)然也可以使用不可變類型(immutable),例如元組,但是這樣就失去了枚舉類型的本意,將標(biāo)簽退化為無意義的變量:
MiracleLove = ("R", "G", "B") print(MiracleLove[0], MiracleLove[1], MiracleLove[2])
為了提供更好的解決方案,Python 通過 PEP 435 在 3.4 版本中添加了 enum 標(biāo)準(zhǔn)庫,3.4 之前的版本也可以通過 pip install enum 下載兼容支持的庫。
enum 提供了 Enum/IntEnum/unique 三個工具,用法也非常簡單,可以通過繼承 Enum/IntEnum 定義枚舉類型,其中 IntEnum 限定枚舉成員必須為(或可以轉(zhuǎn)化為)整數(shù)類型,而 unique 方法可以作為修飾器限定枚舉成員的值不可重復(fù):
from enum import Enum, IntEnum, unique try: @unique class MiracleLove(Enum): MON = "林志玲" TUS = "陳意涵" WEN = "張柏芝" THU = "辛芷蕾" FRI = "周冬雨" except ValueError as e: print(e) # duplicate values found in: FRI -> MON
try: class MiracleLove(IntEnum): MON = 1 TUS = 2 WEN = 3 THU = 4 FRI = "周冬雨" except ValueError as e: print(e) # invalid literal for int() with base 10: "周冬雨"
更有趣的是 Enum 的成員均為單例(Singleton),并且不可實例化,不可更改:
class MiracleLove(Enum): MON = "林志玲" TUS = "陳意涵" WEN = "張柏芝" THU = "辛芷蕾" FRI = "周冬雨" try: MiracleLove.MON = 2 except AttributeError as e: print(e) # Cannot reassign members.
雖然不可實例化,但可以將枚舉成員賦值給變量:
mon = MiracleLove(0) tus = MiracleLove(1) wen = MiracleLove(2) print(mon, tus, wen) # MiracleLove.MON # MiracleLove.TUS # MiracleLove.WEN
也可以進行比較判斷:
print(mon is MiracleLove.MON) print(mon == MiracleLove.MON) print(mon is tus) print(wen != MiracleLove.TUS) print(mon == 0) # 不等于任何非本枚舉類的值 # True # True # False # True # False
最后一點,由于枚舉成員本身也是枚舉類型,因此也可以通過枚舉成員找到其它成員:
print(mon.TUS) print(mon.TUS.WEN.MON) # MiracleLove.TUS # MiracleLove.MON
但是要謹(jǐn)慎使用這一特性,因為可能與成員原有的命名空間中的名稱相沖突:
print(mon.name, ":", mon.value) class Attr(Enum): name = "NAME" value = "VALUE" print(Attr.name.value, Attr.value.name) # R : 0 # NAME value總結(jié):
enum 模塊的用法很簡單,功能也很明確,但是其實現(xiàn)方式卻非常值得學(xué)習(xí)。如果你想更深入了解更多 Python 中關(guān)于 Class 和 Metaclass 的黑魔法,又不知道如何入手,那么不妨閱讀一下 enum 的源碼。
關(guān)注公眾號「Python專欄」,后臺回復(fù)「騰訊架構(gòu)資源1」,獲取由騰訊架構(gòu)師整理的大數(shù)據(jù)學(xué)習(xí)全套資源包!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43488.html
摘要:但好在還給我們提供了一個方法,每一個對象都有這樣一個方法,專門用來判斷某個屬性是否是該對象的私有屬性。如果你想要用對象字面形式,你只能在創(chuàng)建對象時定義訪問器屬性。在中,我們使用凍結(jié)一個對象,并且使用來判斷一個對象是否被凍結(jié)。 說完了對象那些不常用的冷知識,是時候來看看JavaScript中對象屬性有哪些有意思的東西了。 不出你所料,對象屬性自然也有其相應(yīng)的特征屬性,但是這個話題有點復(fù)雜...
摘要:結(jié)構(gòu)體類型的特殊聲明在初階結(jié)構(gòu)體中,我們已經(jīng)將了結(jié)構(gòu)體類型是如何進行聲明的,那么在這里,我們將講一些特殊的結(jié)構(gòu)體聲明不完全的聲明。所以我們應(yīng)該這樣寫通過指針來找到下一個同類型結(jié)構(gòu)體的寫法,我們就稱之為結(jié)構(gòu)體的自引用。 ...
摘要:簡介比更強大的開源語言,簡稱,親爸是微軟。大彬哥就愛吃剁椒魚頭。接口,范型,命名空間,以及模塊化管理,并講在框架和工作流中的應(yīng)用等更多精彩內(nèi)容歡迎大家觀看我的講座極速完全進階指南 +TypeScript簡介 ? 1.比javascript更強大的開源語言,簡稱TS,親爸是微軟。 ? 2.官網(wǎng) ? 英文官網(wǎng):https://www...
摘要:的被設(shè)定為裝飾器可以幫助我們檢查保證沒有重復(fù)值。錯誤記錄等解釋器打印錯誤棧的信息,程序也結(jié)束了。將通過配置記錄到日志文件中方便后續(xù)的排查。同理,指定后,和就不起作用了。啟動的調(diào)試器,讓程序以單步方式運行。 日常的寫在前面 難得的周末,有大段的時間可以用來學(xué)習(xí),體驗就和工作日的晚上完全不一樣了。好好的沉下心學(xué)習(xí)下~即刻很喜歡了! 好好學(xué)習(xí)的分割線 打打打雞血!!!!!! 面向?qū)ο蟾呒壘幊?..
閱讀 1887·2021-11-15 11:46
閱讀 1077·2021-10-26 09:49
閱讀 1819·2021-10-14 09:42
閱讀 3374·2021-09-26 09:55
閱讀 827·2019-08-30 13:58
閱讀 1024·2019-08-29 16:40
閱讀 3462·2019-08-26 10:27
閱讀 601·2019-08-23 18:18