Python3快速入门—7.枚举

7.枚举

7.1枚举的定义和使用

7.1.1枚举的定义

在Python3中新增加了一种数据类型—枚举。

枚举的定义:(1)导入enum模块;(2)使用class定义枚举,并继承Enum类;(3)定义枚举成员。

#程序7-1

from enum import Enum

 

class Color(Enum):

    RED = 0

    BLUE = 1

    GREEN = 2

    YELLOW = 3

    BLACK = 4

上述代码中,定义了枚举Color。其中Color表示数据类型,而不是枚举的对象;RED = 0、BLUE = 1等称为枚举成员;RED表示成员名称(因为是常量,因此大写);0表示成员值。

7.1.2枚举和类

本质上,枚举是一种特殊的类,但是它和普通的类有很多的不同。

1.定义枚举时,其枚举成员的名称不允许相同。

#程序7-2(错误示例)

from enum import Enum

 

class Color(Enum):

RED = 0

    RED = 1

    GREEN = 2

    YELLOW = 3

    BLACK = 4

运行结果:

Traceback (most recent call last):

  File ".\run.py", line 5, in

    class Color(Enum):

  File ".\run.py", line 7, in Color

    RED = 1

  File "D:\Program Files (x86)\Python\Python37-32\lib\enum.py", line 100, in __setitem__

    raise TypeError('Attempted to reuse key: %r' % key)

TypeError: Attempted to reuse key: 'RED'

在普通类定义中,其类成员的成员是允许相同的。

2.默认情况下,不同的成员值允许相同。但是两个相同值的成员,其第二个成员名称是第一个成员名称的别名;因此在访问枚举成员时,只能获取第一个成员。

#程序7-3

from enum import Enum

 

class Color(Enum):

    RED = 0

    BLUE = 1

    GREEN = 1

    YELLOW = 3

    BLACK = 4

 

print(Color(1))

运行结果:

Color.BLUE

3.若要限制枚举中成员值都各不相同,则需要使用装饰器unique。

#程序7-4(错误示例)

from enum import Enum,unique

 

@unique

class Color(Enum):

    RED = 0

    BLUE = 1

    GREEN = 1

    YELLOW = 3

    BLACK = 4

 

print(Color(1))

运行结果:

Traceback (most recent call last):

  File ".\run.py", line 6, in

    class Color(Enum):

  File "D:\Program Files (x86)\Python\Python37-32\lib\enum.py", line 848, in unique

    (enumeration, alias_details))

ValueError: duplicate values found in : GREEN -> BLUE

7.1.3枚举成员的访问

常用的有3种方法。

#程序7-5:方法1

from enum import Enum

 

class Color(Enum):

    RED = 0

    BLUE = 1

    GREEN = 2

    YELLOW = 3

    BLACK = 4

 

print(Color.RED)

print(Color.RED.name)

print(Color.RED.value)

运行结果:

Color.RED

RED

0

通过Color.RED并不能访问其名称或数值,只能得到枚举成员。

#程序7-6:方法2(不推荐)

from enum import Enum

 

class Color(Enum):

    RED = 0

    BLUE = 1

    GREEN = 2

    YELLOW = 3

    BLACK = 4

 

print(Color(1))

print(Color['BLUE'])

运行结果:

Color.BLUE

Color.BLUE

通过Color(1)和Color['BLUE']可以获取枚举成员。当我们通过数值来判断枚举成员时,使用Color(1)这样的方式非常的简单,如Color(1) == Color.BLUE。

#程序7-7:方法3

from enum import Enum

 

class Color(Enum):

    RED = 0

    BLUE = 1

    GREEN = 1

    YELLOW = 3

    BLACK = 4

 

for c in Color:

    print(c)

 

for c in Color.__members__.items():

    print(c)

运行结果:

Color.RED

Color.BLUE

Color.YELLOW

Color.BLACK

('RED', )

('BLUE', )

('GREEN', )

('YELLOW', )

('BLACK', )

使用for循环可以遍历枚举成员。当使用Color.__members__.items()时,可以将枚举成员中相同值的成员也打印出来。

7.2枚举的比较

枚举成员之间的比较只能使用比较运算符==和身份运算符is。

#程序7-8

from enum import Enum

 

class Color(Enum):

    RED = 0

    BLUE = 1

    GREEN = 2

    YELLOW = 3

    BLACK = 4

 

print(Color(1))

if Color(1) == Color.BLUE:

    print('BLUE = 1')

 

print(Color(3))

if Color(3) is Color.YELLOW:

    print('YELLOW = 3')

运行结果:

Color.BLUE

BLUE = 1

Color.YELLOW

YELLOW = 3

枚举成员只能和枚举成员之间比较,而不能和枚举成员的数值进行比较。

你可能感兴趣的:(Python3快速入门—7.枚举)