Python枚举类

时间:2020-02-23 14:42:40  来源:igfitidea点击:

在本教程中,我将为我们提供有关Pythonenum类的概述,以及用于声明和访问Enum成员的不同python脚本示例。

Python枚举类概述

  • 枚举是绑定到唯一,恒定值的一组符号名称(成员)。

  • 枚举模块提供了枚举类型的实现,具有迭代和比较功能。

  • 它可以用来为值创建定义明确的符号,而不是使用文字字符串或者整数。

  • 该模块定义了四个枚举类,可用于定义唯一的名称和值集:Enum,IntEnum,Flag和IntFlag。

  • 它还定义了一个装饰器" unique()"和一个辅助器" auto"。

创建枚举

  • 通过子类化Enum并添加描述值的类属性,可以使用类语法定义新的枚举。

  • 解析类时," Enum"的成员将转换为实例。

  • 每个实例都有一个对应于成员名称的name属性和一个对应于在类定义中分配给该名称的值的value属性。

# Define an enumeration subclass Enum
from enum import Enum
class errorcode(Enum):
    success = 0
    warning = 1
    invalid = 2

其中

  • 错误代码类是一个枚举(或者枚举)。

  • 属性errorcode.success,errorcode.warning,errorcode.invalid等是枚举成员(或者enum成员),并且在功能上是常量。

  • 枚举成员具有"名称"和"值"(errorcode.success的名称为" success",errorcode.success的值为" 0"等)。

声明并打印枚举成员

在此示例python脚本中,我将访问枚举并使用不同的方法打印它们。

#!/usr/bin/env python3
from enum import Enum
class errorcode(Enum):
    success = 0
    warning = 1
    invalid = 2
# Print Enum member "success" for class "errorcode" using string format 
print('Exit message: {}'.format(errorcode.success))
# Print Enum member "invalid" for class "errorcode"
print('Exit message:', errorcode.invalid)
# Print Enum member "warning" for class "errorcode"
print('Exit message:', errorcode(1))

该脚本的输出:

# python3 create_enum.py
Exit message: errorcode.success
Exit message: errorcode.invalid
Exit message: errorcode.warning

将Enum成员打印为字符串类型

要将enum成员打印为字符串类型,可以使用str()函数。
枚举成员的默认类型是它所属的枚举:

#!/usr/bin/env python3
from enum import Enum
class errorcode(Enum):
    success = 0
    warning = 1
    invalid = 2
# Print default type
print('Before: ', type(errorcode.invalid))
# Change the type to string
enum_str = str(errorcode.invalid)
# Check type of variable
print('After: ', type(enum_str))

该脚本的输出:

# python3 create_enum.py
Before:  <enum 'errorcode'>
After:  <class 'str'>

将IntEnum成员打印为Integers类型

与将Enum成员打印为整数类似,我们可以使用int()函数,但我们还必须使用IntEnum子类而不是Enum。

#!/usr/bin/env python3
from enum import IntEnum
class errorcode(IntEnum):
    success = 0
    warning = 1
    invalid = 2
# Print default type
print('Before: ', type(errorcode.invalid))
# Change the type to string
enum_int = int(errorcode.invalid)
# Check type of variable
print('After: ', type(enum_int))

该脚本的输出:

# python3 create_enum.py
Before:  <enum 'errorcode'>
After:  <class 'int'>

打印枚举成员的属性

解析类时," Enum"的成员将转换为实例。
每个实例都有一个对应于成员名称的" name"属性和一个对应于在类定义中分配给该名称的值的" value"属性。

#!/usr/bin/env python3
from enum import Enum
class errorcode(Enum):
    success = 0
    warning = 1
    invalid = 2
# Different method to access the enum members and it's properties
print('Member Name:', errorcode.success.name, ', Member Value:', errorcode.success.value)
print('Member Name:', errorcode(1).name, ', Member Value:', errorcode(1).value)

该脚本的输出:

#  python3 create_enum.py
Member Name: success , Member Value: 0
Member Name: warning , Member Value: 1

将枚举成员打印为代表

repr()函数返回给定对象的可打印表示形式

#!/usr/bin/env python3
from enum import Enum
class errorcode(Enum):
    success = 0
    warning = 1
    invalid = 2
print('repr representation: ',repr(errorcode.success))

此示例脚本的输出:

# python3 create_enum.py
repr representation:  <errorcode.success: 0>

将Enum成员打印为可迭代

枚举支持按定义顺序进行迭代。
在enum类上进行迭代会产生枚举的各个成员。

#!/usr/bin/env python3
from enum import Enum
class errorcode(Enum):
    success = 0
    warning = 1
    invalid = 2
for member in errorcode:
    print(member.name, '=', member.value)

该脚本的输出显示成员是按照在"类"定义中声明的顺序生成的。
名称和值不会以任何方式对它们进行排序。

# python3 create_enum.py
success = 0
warning = 1
invalid = 2

以编程方式创建枚举

在某些情况下,以编程方式创建枚举比在类定义中对其进行硬编码更为方便。
在这种情况下,"枚举"还支持将成员"名称"和"值"传递给"类"构造函数。

语法:

Enum(value='NewEnumName', names=<...>, *, module='...', qualname='...', type=<mixed-in class>, start=1)

value参数是枚举的名称,用于建立成员的表示形式。
names参数列出了枚举的成员。
当传递单个字符串时,它将在whitespace'和commas'上拆分,并且将生成的标记用作成员的" names",这些成员会自动分配以" values"开头的" 1"。

#!/usr/bin/env python3
from enum import Enum
errorcode = Enum (
        value = 'Exit Code',
        names = ('success warning invalid'),
        )
# Print single member
print('Member: ', errorcode.success)
# Iterate over all the members
print('\nAll members:')
for member in errorcode:
    print(member.name, '=', member.value)

该脚本的输出:

# python3 create_enum.py
Member:  Exit Code.success
All members:
success = 1
warning = 2
invalid = 3

默认将1作为起始编号而不是'0'的原因是,从布尔意义上讲,0False,但是enum成员都将其评估为True

为了更好地控制与成员相关的值,可以使用两部分的元组序列或者将名称映射到值的字典来替换名称字符串。
在此示例中,给出了一个由两部分组成的元组的列表,而不是仅包含成员名称的单个字符串。
这样就可以按照与我们先前定义为硬编码值的版本相同的顺序用成员重建错误代码枚举。

#!/usr/bin/env python3
from enum import Enum
errorcode = Enum (
        value = 'Exit Code',
        names = [
            ('success', 0),
            ('warning', 1),
            ('invalid', 2),
            ],
        )
for member in errorcode:
    print(member.name, '=', member.value)

该脚本的输出:

# python3 create_enum.py
success = 0
warning = 1
invalid = 2