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

資訊專欄INFORMATION COLUMN

python模塊之enum_上

kelvinlee / 1087人閱讀

摘要:模塊定義了種枚舉類裝飾器助手在中加入創建枚舉注意點枚舉值可以是任何類型,如果值不重要可以使用自動選擇。使用裝飾器可以對枚舉值進行唯一約束枚舉專用的類裝飾器。序列化一般要求序列化的枚舉要定義在模塊頂層,因為反序列化要求枚舉能夠從模塊導入。

enum模塊定義了:

4種枚舉類:Enum, IntEnum, Flag, IntFlag

裝飾器:unique()

助手:auto

Flag, IntFlag, auto在python3.6中加入

創建枚舉
from enum import Enum
class Color(Enum):
    RED = 2
    GREEN = 4
    BLUE = 6

注意點:
1. 枚舉值可以是任何類型,如果值不重要可以使用auto()自動選擇。但在有其他已定義的值的情況下,謹慎與auto混用
2. Color是枚舉類,Color.RED等是枚舉成員,枚舉成員擁有name和value屬性
3. 雖然使用class關鍵字創建,但枚舉并不是常規意義上的python類

枚舉成員的展現形式:

>>>print(Color.RED)
Color.RED

>>>print(repr(Color.RED))

枚舉成員的type類型是其所屬的枚舉類:

>>>type(Color.RED)

>>>isinstance(Color.RED, Color)
True

枚舉支持按照定義時的順序進行迭代:

>>>for color in Color:
...    print(color)
...
Color.RED
Color.GREEN
Color.BLUE    

枚舉成員是可哈希的,因此可以在字典和集合中使用:

>>> apples = {}
>>> apples[Color.RED] = "red delicious"
>>> apples[Color.GREEN] = "granny smith"
>>> apples == {Color.RED: "red delicious", Color.GREEN: "granny smith"}
True
對枚舉成員及其屬性的程序化訪問

通過值訪問枚舉成員:

>>>Color(2)

通過名稱訪問枚舉成員:

>>>Color["RED"]

獲取枚舉成員的名稱和值:

>>>member = Color.RED
>>>member.name
"RED"
>>>member.value
2
枚舉成員及其值的重復性問題

擁有兩個相同名稱的枚舉成員是不允許的:

>>> class Shape(Enum):
...     SQUARE = 2
...     SQUARE = 3
...
Traceback (most recent call last):
...
TypeError: Attempted to reuse key: "SQUARE"

不過不同的枚舉成員允許擁有相同的值。后定義的成員是先定義的成員的別名,通過值或名稱訪問時都將返回先定義的成員:

>>> class Shape(Enum):
...     SQUARE = 2
...     DIAMOND = 1
...     CIRCLE = 3
...     ALIAS_FOR_SQUARE = 2
...
>>> Shape.SQUARE

>>> Shape.ALIAS_FOR_SQUARE

>>> Shape(2)

注意點:任意兩個枚舉屬性(包括成員、方法等)不允許存在相同的名稱

枚舉值唯一約束

默認情況下,允許多個成員擁有相同的值。使用unique裝飾器可以對枚舉值進行唯一約束

@enum.unique: 枚舉專用的類裝飾器。它在枚舉的__members__屬性中只要查找到成員別名就拋出ValueError異常

>>> 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
自動生成枚舉值

對于不重要的枚舉值,可以使用auto自動生成:

>>> from enum import Enum, auto
>>> class Color(Enum):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> list(Color)
[, , ]

auto生成什么值取決于_generate_next_value_()方法,可重寫:

>>> 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)
[, , , ]
迭代

對枚舉成員的迭代,并不會包含成員別名:

>>> list(Shape)
[, , ]

__members__屬性是一個映射了枚舉成員及其名稱的有序字典,包括成員別名:

>>> for name, member in Shape.__members__.items():
...     name, member
...
("SQUARE", )
("DIAMOND", )
("CIRCLE", )
("ALIAS_FOR_SQUARE", )

>>> [name for name, member in Shape.__members__.items() if member.name != name]
["ALIAS_FOR_SQUARE"]
枚舉比較(后兩種不適用于IntEnum)
>>> Color.RED is Color.RED
True

>>> Color.RED == Color.BLUE
False

>>> Color.RED < Color.BLUE
Traceback (most recent call last):
  File "", line 1, in 
TypeError: "<" not supported between instances of "Color" and "Color"

>>> Color.BLUE == 6 # 與非枚舉的值進行等值比較總是返回False
False
允許的枚舉成員與屬性

枚舉是python類,也可以擁有普通方法和特殊方法:

class Mood(Enum):
    FUNKY = 1
    HAPPY = 3

    def describe(self):
        # self is the member here
        return self.name, self.value

    def __str__(self):
        return "my custom str! {0}".format(self.value)

    @classmethod
    def favorite_mood(cls):
        # cls here is the enumeration
        return cls.HAPPY

注意點:如果枚舉中定義了__new()__或者__init__()方法,賦值給枚舉成員的值將被傳遞到__new()__或者__init__()

枚舉的繼承限制

自定義枚舉類必須繼承自一個枚舉基類,至多一個具體的數據類型以及0至多個混合類。繼承順序如下:

class EnumName([mix-in, ...,] [data-type,] base-enum):
    pass

基類枚舉如果已經定義了成員,則不能被任何子類繼承,如下第一種是不允許的,但第二種可以:

>>> class MoreColor(Color):
...     PINK = 17
...
Traceback (most recent call last):
...
TypeError: Cannot extend enumerations
>>> class Foo(Enum):
...     def some_behavior(self):
...         pass
...
>>> class Bar(Foo):
...     HAPPY = 1
...     SAD = 2
...

不能這么做的原因是可能破壞某些重要的不允許改變的值(原話是would lead to a violation of some important invariants of bytes and instances)。

序列化
>>> from a.b import Color
>>> from pickle import dumps, loads
>>> Color.RED is loads(dumps(Color.RED))
True

一般要求序列化的枚舉要定義在模塊頂層,因為反序列化要求枚舉能夠從模塊導入。不過在第4版的pickle協議中,已經可以序列化嵌套在類中的枚舉

通過在枚舉中定義__reduce_ex__()方法,可以修改枚舉成員的序列化/反序列化行為

Functional API

枚舉類是可調用的:

>>> Animal = Enum("Pet", "Tortoise CAT DOG")

完整的API如下:
Enum(value="NewEnumName", names=<...>, *, module="...", qualname="...", type=, start=1)

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

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

相關文章

  • Python入門細節

    摘要:入門細節相除后的類型雙斜杠是整除,出來的類型是。序列,集合和字典屬于組,是的基本數據類型。變量名區分大小寫。盡量避免循環引入。變量函數等引入內指定的變量函數等。中如果沒有出現模塊名也是絕對導入。頂級包與入口文件的位置 python入門細節 相除后的類型 type(2/2) float type(2//2) int 雙斜杠是整除,出來的類型是int。單斜杠的出來的是float類型。 進制...

    microcosm1994 評論0 收藏0
  • Pythonenum 模塊源碼分析

    摘要:起步上一篇的枚舉類型文末說有機會的話可以看看它的源碼。但這樣的方式并不好,范圍大,它包含該類的所有屬性和方法。而不單單是枚舉的命名空間。每個成員都有名稱屬性和值屬性上述的代碼中,取得的值是。 起步 上一篇 《Python 的枚舉類型》 文末說有機會的話可以看看它的源碼。那就來讀一讀,看看枚舉的幾個重要的特性是如何實現的。 要想閱讀這部分,需要對元類編程有所了解。 成員名不允許重復 這部...

    muddyway 評論0 收藏0
  • python:基礎知識

    摘要:與字符串不同,列表元素支持改寫。元組比列表更加安全,因為不能修改集合一個功能是進行集合操作,另一個功能是消除重復的元素。 基本數據類型 數字 整型,浮點型,布爾型,復數 組 序列,集合,字典 1 組 # 序列-字符串 str 不可變類型 # 序列-列表 list [1,2,3,4,5,6,as] 可變類型 # 序列-元組 tuple (1,2,3,4,5,6,as) 不可變類型 ...

    xiongzenghui 評論0 收藏0
  • Python 的枚舉類型

    摘要:起步的原生類型中并不包含枚舉類型。枚舉類型可以看作是一種標簽或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期月份狀態等。簡單的示例枚舉成員有值默認可重復,枚舉成員具有友好的字符串表示枚舉類型不可實例化,不可更改。 起步 Python 的原生類型中并不包含枚舉類型。為了提供更好的解決方案,Python 通過 PEP 435 在 3.4 版本中添加了 enum 標準庫。 枚舉...

    wall2flower 評論0 收藏0
  • Emscripten教程C++和JavaScript綁定(三)

    摘要:支持綁定大多數的結構,包括和中引入的。枚舉支持枚舉和枚舉類。雖然還有進一步優化的空間,但到目前為止,它在實際應用程序中的性能已經被證明是完全可以接受的。 翻譯:云荒杯傾 Embind用于綁定C++函數和類到JavaScript,這樣編譯代碼就能在js中以一種很自然的方式來使用。Embind也支持從C++調JavaScript的class。 Embind支持綁定大多數C++的結構,包括C...

    warkiz 評論0 收藏0

發表評論

0條評論

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