7.12. 枚举类

用常量和枚举类型来代替字面量的好处。

  • 更易读:所有人都不需要记忆某个数字代表什么。

  • 更健壮:降低输错数字或字母产生bug的可能性

7.12.1. 1. 枚举类使用

程序有两种方式来定义枚举类 1.直接使用Enum列出多个枚举值来创建枚举类。 2.通过继承Enum基类来派生枚举类。

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/5/18 8:19
# filename: 枚举类.py
"""
枚举是用来管理一组相关的有限个数常量的集合,使用枚举可以提高程序的可读性,使代码更清晰且更易于维护。
python提供枚举类型,本质上是一种类
"""
"""
python中定义枚举类的语法如下:

class 枚举名(enum.Enum):
    枚举常量列表
"""
import enum


class WeekDays(enum.Enum):
    # 枚举常量列表
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3
    THURSDAY = 4
    FRIDAY = 10



day = WeekDays.FRIDAY
print(day)
print(day.name)
print(day.value)
print(day.THURSDAY.name)
print(day.THURSDAY.value)

输出结果:

WeekDays.FRIDAY
FRIDAY
10
THURSDAY
4
value是返回枚举值,name是返回枚举名

常量的值可以是任何类型,多个成员的值也可以相同

7.12.2. 2.限制枚举类

限制常量只能为整数使用 enum.IntEnum

防止常量成员值重复,使用@enum.unique装饰器

import enum

@enum.unique
class WeekDays(enum.IntEnum):
    # 枚举常量列表
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3
    THURSDAY = 4
    FRIDAY = 10



day = WeekDays.FRIDAY
print(day)
print(day.name)
print(day.value)
print(day.THURSDAY.name)
print(day.THURSDAY.value)

输出结果

WeekDays.FRIDAY
FRIDAY
10
THURSDAY
4

7.12.3. 3. 枚举类示例

import enum

@enum.unique
class WeekDays(enum.IntEnum):
    # 枚举常量列表
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3
    THURSDAY = 4
    FRIDAY = 10



day = WeekDays.FRIDAY

if day == WeekDays.MONDAY:
    print("努力工作吧,尽力不要让自己后悔,做个有钱人")
elif day == WeekDays.FRIDAY:
    print("累了就休息一会儿,然后继续上路")

输出结果

累了就休息一会儿,然后继续上路

举例1

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/5/31 18:26
# filename: 枚举类2.py

import enum


class ORientation(enum.Enum):
    # 为序列值指定value值
    EAST = "东"
    SOUTH = "南"
    WEST = "西"
    NORTH = "北"

    def info(self):
        print("这是一个代表【{0}】方向的枚举".format(self.value))


print(ORientation.SOUTH)
print(ORientation.SOUTH.value)
# 通过枚举变量访问枚举
print(ORientation['WEST'])
# 通过枚举值来访问枚举
print(ORientation('南'))

# 通过枚举的info()方法
ORientation.EAST.info()

# 遍历枚举的所有成员
for name, number in ORientation.__members__.items():
    print(name, "===>", number, ",", number.value)

输出结果

ORientation.SOUTH
南
ORientation.WEST
ORientation.SOUTH
这是一个代表【东】方向的枚举
EAST ===> ORientation.EAST , 东
SOUTH ===> ORientation.SOUTH , 南
WEST ===> ORientation.WEST , 西
NORTH ===> ORientation.NORTH , 北

举例2

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/5/31 18:44
# filename: 枚举类3.py

import enum


class Man(enum.Enum):
    MALE = "男", "帅气"
    FEMALE = "女", "美丽"

    def __init__(self, cn_name, desc):
        self._cn_name = cn_name
        self._desc = desc

    @property
    def desc(self):
        return self._desc

    @property
    def cn_name(self):
        return self._cn_name


#访问MALE的name
print("MALE的name:{}".format(Man.MALE.name))
#访问MALE的value
print("MALE的value:{}".format(Man.MALE.value))


#访问MALE自定义的cn_name属性
print("访问MALE自定义的cn_name属性:{}".format(Man.MALE.cn_name))


#访问MALE自定义的desc属性
print("访问MALE自定义的desc属性:{}".format(Man.MALE.desc))

输出信息

MALE的name:MALE
MALE的value:('男', '帅气')
访问MALE自定义的cn_name属性:
访问MALE自定义的desc属性:帅气