枚舉是綁定到唯一的常量值的一組符號名稱(成員)。在枚舉中,成員可以通過身份進(jìn)行比較,枚舉本身可以迭代。
1.Enum模塊
該模塊定義了四個枚舉類,可用于定義唯一的名稱和值集:Enum,IntEnum,F(xiàn)lag和IntFlag。它還定義了一個裝飾器,unique()和一個helper,auto。
Content | Description | ?Remarks? |
class enum.Enum? | 創(chuàng)建枚舉實(shí)例的基類 | ? |
class enum.IntEnum? | 用于創(chuàng)建同屬于int子類枚舉常量的基類 | ?????????????????????????? |
class enum.IntFlag | 用于創(chuàng)建枚舉常量的基類,可以使用按位運(yùn)算符組合而不會丟失其IntFlag成員資格。 IntFlag成員也是int的子類。 | New in version 3.6 |
class enum.Flag | 用于創(chuàng)建枚舉常量的基類,可以使用按位運(yùn)算符組合而不會丟失其IntFlag成員資格。 | New in version 3.6 |
unique()??????????????????? | 枚舉類裝飾器,用于確保任何一個值只有一個名字與其綁定 | ? |
class enum.auto | 實(shí)例被替換為枚舉成員的合適值 | New in version 3.6 |
2.創(chuàng)建一個枚舉類
創(chuàng)建一個枚舉類很簡單,如下所示:
>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
...
說明:
(1) 枚舉類得成員值可以是任何值,比如int,str等。如果確定值不重要,你可以使用auto實(shí)例來產(chǎn)生一個合適值。但是混用auto實(shí)例和其他值一定要慎重。
(2) 類Color是一個枚舉。屬性Color.RED,Color.GREEN等是枚舉成員(或枚舉成員),并且是函數(shù)常量。枚舉成員具有名稱和值(Color.RED的名稱為RED,Color.BLUE的值為3等)
枚舉成員擁有易讀的字符表現(xiàn)形式:
>>> print(Color.RED)
Color.RED
利用repr()函數(shù)可以得到更多信息:
>>> print(repr(Color.RED))
枚舉成員的類型是它所屬的枚舉:
>>> type(Color.RED)
>>> isinstance(Color.GREEN, Color)
True
>>>
枚舉成員也有一個只包含其項目名稱的屬性:
>>> print(Color.RED.name)
RED
枚舉支持迭代,按定義順序:
>>> class Shake(Enum):
... VANILLA = 7
... CHOCOLATE = 4
... COOKIES = 9
... MINT = 3
...
>>> for shake in Shake:
... print(shake)
...
Shake.VANILLA
Shake.CHOCOLATE
Shake.COOKIES
Shake.MINT
枚舉成員可以是哈希的,所以它們可以在字典和集合中使用:
>>> apples = {}
>>> apples[Color.RED] = 'red delicious'
>>> apples[Color.GREEN] = 'granny smith'
>>> apples == {Color.RED: 'red delicious', Color.GREEN: 'granny smith'}
True
?
3.程序訪問枚舉成員及其屬性
有時候以編程方式訪問成員函數(shù)(即Color.RED不會執(zhí)行的情況是有用的,因?yàn)樵诔绦驅(qū)懭霑r間沒有確切的顏色)。枚舉允許這樣的訪問:
>>> Color(1)
>>> Color(3)
如果你想用名字訪問枚舉成員,可以使用項目訪問:
>>> Color['RED']
>>> Color['GREEN']
如果你有一個枚舉成員,并且需要它的名字和值:
>>> member = Color.RED
>>> member.name
'RED'
>>> member.value
1
4.復(fù)用枚舉成員和值
兩個枚舉成員擁有相同的名字是不合法的:
>>> class Shape(Enum):
... SQUARE = 2
... SQUARE = 3
...
Traceback (most recent call last):
...
TypeError: Attempted to reuse key: 'SQUARE'
但是,兩個枚舉成員允許擁有相同的值。如果兩個成員A和B有相同的值(并且A先定義),B是A的一個別名。根據(jù)值查詢A和B都會放回A。根據(jù)名字查詢B也會返回A。
>>> class Shape(Enum):
... SQUARE = 2
... DIAMOND = 1
... CIRCLE = 3
... ALIAS_FOR_SQUARE = 2
...
>>> Shape.SQUARE
>>> Shape.ALIAS_FOR_SQUARE
>>> Shape(2)
注意:嘗試去創(chuàng)建一個與已定義屬性同名的成員或者嘗試創(chuàng)建一個與成員同名的方法是不允許的。
5.確保唯一的枚舉值
默認(rèn)情況下,枚舉允許多個名稱作為同一個值的別名。當(dāng)不需要此行為時,可以使用以下裝飾器來確保每個值在枚舉中僅使用一次:
@
enum.
unique
專門用于枚舉的類裝飾器。它搜索枚舉的__members__收集它發(fā)現(xiàn)的任何別名;如果有的話,會發(fā)現(xiàn)ValueError帶有細(xì)節(jié):
>>> from enum import Enum, unique
>>> @unique
... class Mistake(Enum):
... ONE = 1
... TWO = 2
... THREE = 3
... FOUR = 3
...
Traceback (most recent call last):
...
ValueError: duplicate values found in
: FOUR -> THREE
6.使用自動賦值
如果確切的值不重要,您可以使用auto:
>>> from enum import Enum, auto
>>> class Color(Enum):
... RED = auto()
... BLUE = auto()
... GREEN = auto()
...
>>> list(Color)
[
,
,
]
auto產(chǎn)生的值由_generate_next_value_()函數(shù)產(chǎn)生,該函數(shù)可以被重寫:
>>> class AutoName(Enum):
... def _generate_next_value_(name, start, count, last_values):
... return name
...
>>> class Ordinal(AutoName):
... NORTH = auto()
... SOUTH = auto()
... EAST = auto()
... WEST = auto()
...
>>> list(Ordinal)
[
,
,
,
]
?
?
?
轉(zhuǎn)自:https://www.cnblogs.com/bdhk/p/7506691.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
