日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

enum python_enum:python实现枚举也很优雅

發(fā)布時間:2025/3/20 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 enum python_enum:python实现枚举也很优雅 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

介紹

enum是一個用來枚舉的模塊

創(chuàng)建枚舉類型

import enum

# 創(chuàng)建一個類,繼承自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

print(Color.red, type(Color.red)) # Color.red

# 打印的是類型

# 那么如何獲取里面的值呢?

# 調(diào)用name獲取名稱,調(diào)用value獲取值

print(Color.red.name, type(Color.red.name)) # red

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

# 如果我定義了重復(fù)的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重復(fù)了

import enum

# 如果我定義了重復(fù)的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

# 如果值相同的話,那么后者相當(dāng)于前者的別名,兩者指向的內(nèi)容是一樣的

for c in Color:

print(c)

"""

Color.red

Color.green

Color.blue

Color.yellow

Color.pink

Color.cyan

"""

# purple依舊沒有打印

# 那如果我就想把值相同的也打印出來,要怎么做呢?

# 枚舉內(nèi)部有一個__members__屬性,相當(dāng)于一個字典

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,但是對應(yīng)的枚舉類型依舊是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

# 成員之前也可以進(jìn)行比較,但只支持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

"""

可以看到,盡管無法重新賦值,但是本地修改還是可以的,如果是可變類型的話

但是兩個還是一樣的,因?yàn)閜urple是cyan的別名,當(dāng)在創(chuàng)建這個類的時候,由于都是空列表,所以認(rèn)為兩者是一樣

因此當(dāng)我對cyan.value進(jìn)行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]

強(qiáng)制讓成員的值不一樣

枚舉類,key重復(fù)是不允許的,但是值重復(fù)是可以的,可如果我也不允許值重復(fù)呢?只需要加上一個裝飾器即可

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 : purple -> cyan

# 提示我們purple和cyan的value重復(fù)了

比較成員的值

之前說過,枚舉成員是不支持大小比較的,但如果我想支持呢?

import enum

# 換一種繼承的類,改成IntEnum

class Color(enum.IntEnum):

red = 1

green = 2

blue = 3

yellow = 4

pink = 5

cyan = "6"

# 此時里面的成員要是int類型,或者能將字符串轉(zhuǎn)成int

print(Color.red < Color.blue) # True

print(Color.red + Color.cyan) # 7

總結(jié)

以上是生活随笔為你收集整理的enum python_enum:python实现枚举也很优雅的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。