成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

python模塊之enum_上

kelvinlee / 1147人閱讀

摘要:模塊定義了種枚舉類(lèi)裝飾器助手在中加入創(chuàng)建枚舉注意點(diǎn)枚舉值可以是任何類(lèi)型,如果值不重要可以使用自動(dòng)選擇。使用裝飾器可以對(duì)枚舉值進(jìn)行唯一約束枚舉專(zhuān)用的類(lèi)裝飾器。序列化一般要求序列化的枚舉要定義在模塊頂層,因?yàn)榉葱蛄谢竺杜e能夠從模塊導(dǎo)入。

enum模塊定義了:

4種枚舉類(lèi):Enum, IntEnum, Flag, IntFlag

裝飾器:unique()

助手:auto

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

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

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

枚舉成員的展現(xiàn)形式:

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

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

枚舉成員的type類(lèi)型是其所屬的枚舉類(lèi):

>>>type(Color.RED)

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

枚舉支持按照定義時(shí)的順序進(jìn)行迭代:

>>>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
對(duì)枚舉成員及其屬性的程序化訪問(wèn)

通過(guò)值訪問(wèn)枚舉成員:

>>>Color(2)

通過(guò)名稱(chēng)訪問(wèn)枚舉成員:

>>>Color["RED"]

獲取枚舉成員的名稱(chēng)和值:

>>>member = Color.RED
>>>member.name
"RED"
>>>member.value
2
枚舉成員及其值的重復(fù)性問(wèn)題

擁有兩個(gè)相同名稱(chēng)的枚舉成員是不允許的:

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

不過(guò)不同的枚舉成員允許擁有相同的值。后定義的成員是先定義的成員的別名,通過(guò)值或名稱(chēng)訪問(wèn)時(shí)都將返回先定義的成員:

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

>>> Shape.ALIAS_FOR_SQUARE

>>> Shape(2)

注意點(diǎn):任意兩個(gè)枚舉屬性(包括成員、方法等)不允許存在相同的名稱(chēng)

枚舉值唯一約束

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

@enum.unique: 枚舉專(zhuān)用的類(lèi)裝飾器。它在枚舉的__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
自動(dòng)生成枚舉值

對(duì)于不重要的枚舉值,可以使用auto自動(dòng)生成:

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

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

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

對(duì)枚舉成員的迭代,并不會(huì)包含成員別名:

>>> list(Shape)
[, , ]

__members__屬性是一個(gè)映射了枚舉成員及其名稱(chēng)的有序字典,包括成員別名:

>>> 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 # 與非枚舉的值進(jìn)行等值比較總是返回False
False
允許的枚舉成員與屬性

枚舉是python類(lèi),也可以擁有普通方法和特殊方法:

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

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

枚舉的繼承限制

自定義枚舉類(lèi)必須繼承自一個(gè)枚舉基類(lèi),至多一個(gè)具體的數(shù)據(jù)類(lèi)型以及0至多個(gè)混合類(lèi)。繼承順序如下:

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

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

>>> 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

一般要求序列化的枚舉要定義在模塊頂層,因?yàn)榉葱蛄谢竺杜e能夠從模塊導(dǎo)入。不過(guò)在第4版的pickle協(xié)議中,已經(jīng)可以序列化嵌套在類(lèi)中的枚舉

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

Functional API

枚舉類(lèi)是可調(diào)用的:

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/42548.html

相關(guān)文章

  • Python入門(mén)細(xì)節(jié)

    摘要:入門(mén)細(xì)節(jié)相除后的類(lèi)型雙斜杠是整除,出來(lái)的類(lèi)型是。序列,集合和字典屬于組,是的基本數(shù)據(jù)類(lèi)型。變量名區(qū)分大小寫(xiě)。盡量避免循環(huán)引入。變量函數(shù)等引入內(nèi)指定的變量函數(shù)等。中如果沒(méi)有出現(xiàn)模塊名也是絕對(duì)導(dǎo)入。頂級(jí)包與入口文件的位置 python入門(mén)細(xì)節(jié) 相除后的類(lèi)型 type(2/2) float type(2//2) int 雙斜杠是整除,出來(lái)的類(lèi)型是int。單斜杠的出來(lái)的是float類(lèi)型。 進(jìn)制...

    microcosm1994 評(píng)論0 收藏0
  • Pythonenum 模塊源碼分析

    摘要:起步上一篇的枚舉類(lèi)型文末說(shuō)有機(jī)會(huì)的話可以看看它的源碼。但這樣的方式并不好,范圍大,它包含該類(lèi)的所有屬性和方法。而不單單是枚舉的命名空間。每個(gè)成員都有名稱(chēng)屬性和值屬性上述的代碼中,取得的值是。 起步 上一篇 《Python 的枚舉類(lèi)型》 文末說(shuō)有機(jī)會(huì)的話可以看看它的源碼。那就來(lái)讀一讀,看看枚舉的幾個(gè)重要的特性是如何實(shí)現(xiàn)的。 要想閱讀這部分,需要對(duì)元類(lèi)編程有所了解。 成員名不允許重復(fù) 這部...

    muddyway 評(píng)論0 收藏0
  • python:基礎(chǔ)知識(shí)

    摘要:與字符串不同,列表元素支持改寫(xiě)。元組比列表更加安全,因?yàn)椴荒苄薷募弦粋€(gè)功能是進(jìn)行集合操作,另一個(gè)功能是消除重復(fù)的元素。 基本數(shù)據(jù)類(lèi)型 數(shù)字 整型,浮點(diǎn)型,布爾型,復(fù)數(shù) 組 序列,集合,字典 1 組 # 序列-字符串 str 不可變類(lèi)型 # 序列-列表 list [1,2,3,4,5,6,as] 可變類(lèi)型 # 序列-元組 tuple (1,2,3,4,5,6,as) 不可變類(lèi)型 ...

    xiongzenghui 評(píng)論0 收藏0
  • Python 的枚舉類(lèi)型

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

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

    摘要:支持綁定大多數(shù)的結(jié)構(gòu),包括和中引入的。枚舉支持枚舉和枚舉類(lèi)。雖然還有進(jìn)一步優(yōu)化的空間,但到目前為止,它在實(shí)際應(yīng)用程序中的性能已經(jīng)被證明是完全可以接受的。 翻譯:云荒杯傾 Embind用于綁定C++函數(shù)和類(lèi)到JavaScript,這樣編譯代碼就能在js中以一種很自然的方式來(lái)使用。Embind也支持從C++調(diào)JavaScript的class。 Embind支持綁定大多數(shù)C++的結(jié)構(gòu),包括C...

    warkiz 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<