enum:python實現枚舉也很優雅

介紹

enum是一個用來枚舉的模塊

建立枚舉類型

import enum


# 建立一個類,繼承自enum下的Enum
class Color(enum.Enum):
    red = 1
    green = 2
    blue = 3
    yellow = 4
    pink = 5
    cyan = 6


# 下面即可以經過名稱直接獲取成員
print(Color["red"], type(Color["red"]))  # Color.red <enum 'Color'>
print(Color.red, type(Color.red))  # Color.red <enum 'Color'>
# 打印的是<enum 'Color'>類型

# 那麼如何獲取裏面的值呢?
# 調用name獲取名稱,調用value獲取值
print(Color.red.name, type(Color.red.name))  # red <class 'str'>
print(Color.red.value)  # 1

# 也能夠經過迭代來獲取值
for c in Color:
    print(c.name, c.value)
"""
red 1
green 2
blue 3
yellow 4
pink 5
cyan 6
"""

名稱或者值相同

import enum


# 若是我定義了重複的key(仮)
try:
    class Color(enum.Enum):
        red = 1
        green = 2
        blue = 3
        yellow = 4
        pink = 5
        cyan = 6

        cyan = 5

except Exception as e:
    print(e)  # Attempted to reuse key: 'cyan'

# 提示咱們key重複了
import enum


# 若是我定義了重複的value(仮)
class Color(enum.Enum):
    red = 1
    green = 2
    blue = 3
    yellow = 4
    pink = 5
    cyan = 6

    purple = 6


# 這是經過value來獲取成員
# 獲取成員能夠經過Color.key | Color[key]的方式,還能夠使用Color(value)的方式
print(Color(6).name)  # cyan
print(Color.purple.name)  # cyan
# 能夠看到只打印了cyan
# 若是值相同的話,那麼後者至關於前者的別名,二者指向的內容是同樣的

for c in Color:
    print(c)
"""
Color.red
Color.green
Color.blue
Color.yellow
Color.pink
Color.cyan
"""
# purple依舊沒有打印


# 那若是我就想把值相同的也打印出來,要怎麼作呢?
# 枚舉內部有一個__members__屬性,至關於一個字典
for c in Color.__members__.items():
    print(c[0], c[1])
"""
red Color.red
green Color.green
blue Color.blue
yellow Color.yellow
pink Color.pink
cyan Color.cyan
purple Color.cyan
"""
# 第一個元素是key,str類型。第二個元素是枚舉類型。
# 能夠看到最後一個,即使key是purple,可是對應的枚舉類型依舊是Color.cyan
for c in Color.__members__.items():
    print(c[0], c[1], c[1].name, c[1].value)
"""
red Color.red red 1
green Color.green green 2
blue Color.blue blue 3
yellow Color.yellow yellow 4
pink Color.pink pink 5
cyan Color.cyan cyan 6
purple Color.cyan cyan 6
"""
# 最後一個打印的還是cyan


# 成員以前也能夠進行比較,但只支持is和==操做符,不支持大小比較
print(Color.green is Color.red)  # False
print(Color.green is Color.green)  # True
print(Color.cyan is Color.purple)  # True
print(Color.cyan == Color.purple)  # True

成員的值是否可變

import enum


class Color(enum.Enum):
    red = 1
    green = 2
    blue = 3
    yellow = 4
    pink = 5
    cyan = 6

    purple = 6


try:
    Color.red.name = "xxx"
except Exception as e:
    print(e)  # can't set attribute


try:
    Color.red.value = "xxx"
except Exception as e:
    print(e)  # can't set attribute

# 能夠看到是沒法賦值的
import enum


class Color(enum.Enum):
    red = 1
    green = 2
    blue = 3
    yellow = 4
    pink = 5
    cyan = []

    purple = []


print(Color.cyan is Color.purple)  # True
Color.cyan.value.append(123)
print(Color.cyan is Color.purple)  # True
"""
能夠看到,儘管沒法從新賦值,可是本地修改仍是能夠的,若是是可變類型的話
可是兩個仍是同樣的,由於purple是cyan的別名,當在建立這個類的時候,因爲都是空列表,因此認爲二者是同樣
所以當我對cyan.value進行append的時候,會影響purple
"""

print(Color.cyan.value)  # [123]
print(Color.purple.value)  # [123]

Color.purple.value.append(456)

# 經過反過來也是同樣的
print(Color.cyan.value)  # [123, 456]
print(Color.purple.value)  # [123, 456]

強制讓成員的值不同

枚舉類,key重複是不容許的,可是值重複是能夠的,可若是我也不容許值重複呢?只須要加上一個裝飾器便可python

import enum


try:
    @enum.unique
    class Color(enum.Enum):
        red = 1
        green = 2
        blue = 3
        yellow = 4
        pink = 5
        cyan = []

        purple = []

except Exception as e:
    print(e)  # duplicate values found in <enum 'Color'>: purple -> cyan
    
# 提示咱們purple和cyan的value重複了

比較成員的值

以前說過,枚舉成員是不支持大小比較的,但若是我想支持呢?app

import enum


# 換一種繼承的類,改爲IntEnum
class Color(enum.IntEnum):
    red = 1
    green = 2
    blue = 3
    yellow = 4
    pink = 5
    cyan = "6"


# 此時裏面的成員要是int類型,或者能將字符串轉成int

print(Color.red < Color.blue)  # True
print(Color.red + Color.cyan)  # 7
相關文章
相關標籤/搜索