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

資訊專欄INFORMATION COLUMN

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

zsy888 / 2744人閱讀

摘要:枚舉類型可以看作是一種標簽或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期月份狀態等。

枚舉類型可以看作是一種標簽或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、狀態等。

Python 的原生類型(Built-in types)里并沒有專門的枚舉類型,但是我們可以通過很多方法來實現它,例如字典、類等:

MiracleLove = {"MON": "林志玲", "TUS": "陳意涵", "WEN": "張柏芝", "THU": "辛芷蕾", "FRI": "周冬雨"}

class MiracleLove:
   MON = "林志玲"
   TUS = "陳意涵"
   WEN = "張柏芝"
   THU = "辛芷蕾"
   FRI = "周冬雨"

上面兩種方法可以看做是簡單的枚舉類型的實現。

如果只在局部范圍內用到了這樣的枚舉變量是沒有問題的。

但問題在于它們都是可變的(mutable),也就是說可以在其它地方被修改從而影響其正常使用:

MiracleLove["MON"] = MiracleLove["FRI"]
print(MiracleLove)

通過類定義的枚舉甚至可以實例化,變得不倫不類:

ml = MiracleLove()
print(ml.MON)

MiracleLove.MON = 2
print(ml.MON)

當然也可以使用不可變類型(immutable),例如元組,但是這樣就失去了枚舉類型的本意,將標簽退化為無意義的變量:

MiracleLove = ("R", "G", "B")
print(MiracleLove[0], MiracleLove[1], MiracleLove[2])

為了提供更好的解決方案,Python 通過 PEP 435 在 3.4 版本中添加了 enum 標準庫,3.4 之前的版本也可以通過 pip install enum 下載兼容支持的庫。

enum 提供了 Enum/IntEnum/unique 三個工具,用法也非常簡單,可以通過繼承 Enum/IntEnum 定義枚舉類型,其中 IntEnum 限定枚舉成員必須為(或可以轉化為)整數類型,而 unique 方法可以作為修飾器限定枚舉成員的值不可重復:

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

但是要謹慎使用這一特性,因為可能與成員原有的命名空間中的名稱相沖突:

print(mon.name, ":", mon.value)

class Attr(Enum):
   name  = "NAME"
   value = "VALUE"

print(Attr.name.value, Attr.value.name)

# R : 0
# NAME value
總結:

enum 模塊的用法很簡單,功能也很明確,但是其實現方式卻非常值得學習。如果你想更深入了解更多 Python 中關于 Class 和 Metaclass 的黑魔法,又不知道如何入手,那么不妨閱讀一下 enum 的源碼。

關注公眾號「Python專欄」,后臺回復「騰訊架構資源1」,獲取由騰訊架構師整理的大數據學習全套資源包!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43488.html

相關文章

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

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

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

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

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

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

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

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

    greatwhole 評論0 收藏0

發表評論

0條評論

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