国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

別再說Python沒有枚舉類型了,好好看看

zsy888 / 2737人閱讀

摘要:枚舉類型可以看作是一種標(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

相關(guān)文章

  • 關(guān)于JavaScript對象,你所不知道的事(二)- 再說屬性

    摘要:但好在還給我們提供了一個方法,每一個對象都有這樣一個方法,專門用來判斷某個屬性是否是該對象的私有屬性。如果你想要用對象字面形式,你只能在創(chuàng)建對象時定義訪問器屬性。在中,我們使用凍結(jié)一個對象,并且使用來判斷一個對象是否被凍結(jié)。 說完了對象那些不常用的冷知識,是時候來看看JavaScript中對象屬性有哪些有意思的東西了。 不出你所料,對象屬性自然也有其相應(yīng)的特征屬性,但是這個話題有點復(fù)雜...

    Richard_Gao 評論0 收藏0
  • C語言中還有這些類型再說你不知道!手把手帶你解鎖C語言中的自定義類型,讓你寫你所想。

    摘要:結(jié)構(gòu)體類型的特殊聲明在初階結(jié)構(gòu)體中,我們已經(jīng)將了結(jié)構(gòu)體類型是如何進行聲明的,那么在這里,我們將講一些特殊的結(jié)構(gòu)體聲明不完全的聲明。所以我們應(yīng)該這樣寫通過指針來找到下一個同類型結(jié)構(gòu)體的寫法,我們就稱之為結(jié)構(gòu)體的自引用。 ...

    hizengzeng 評論0 收藏0
  • TypeScript極速完全進階指南-1初級篇

    摘要:簡介比更強大的開源語言,簡稱,親爸是微軟。大彬哥就愛吃剁椒魚頭。接口,范型,命名空間,以及模塊化管理,并講在框架和工作流中的應(yīng)用等更多精彩內(nèi)容歡迎大家觀看我的講座極速完全進階指南 +TypeScript簡介 ? 1.比javascript更強大的開源語言,簡稱TS,親爸是微軟。 ? 2.官網(wǎng) ? 英文官網(wǎng):https://www...

    HmyBmny 評論0 收藏0
  • 小李飛刀:ppppppython你好哇

    摘要:的被設(shè)定為裝飾器可以幫助我們檢查保證沒有重復(fù)值。錯誤記錄等解釋器打印錯誤棧的信息,程序也結(jié)束了。將通過配置記錄到日志文件中方便后續(xù)的排查。同理,指定后,和就不起作用了。啟動的調(diào)試器,讓程序以單步方式運行。 日常的寫在前面 難得的周末,有大段的時間可以用來學(xué)習(xí),體驗就和工作日的晚上完全不一樣了。好好的沉下心學(xué)習(xí)下~即刻很喜歡了! 好好學(xué)習(xí)的分割線 打打打雞血!!!!!! 面向?qū)ο蟾呒壘幊?..

    greatwhole 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<