Python编程思想(31):枚举类型深度详解

44 篇文章 4 订阅
33 篇文章 47 订阅

李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习。

 

《Python编程思想》总目录
《Python编程思想》专栏

在很多场景下,一个变量的值是固定且有限的,例如,季节只有4个值(春、夏、秋、冬),性别只有2个值(男和女)。这种值有限且固定的数据类型在Python中称为枚举类型。

1. 枚举类型基础

在Python中有两种方式来定义枚举类型:

  • 直接使用Enum列出多个枚举值来创建枚举类
  • 通过继承Enum基类来派生枚举类

如下面的代码演示了直接使用Enum列出多个枚举值来创建枚举类类型。

示例代码: enum_demo. py

import enum
# 定义Season枚举类
Season = enum.Enum('Season', ('SPRING', 'SUMMER', 'AUTUMN', 'WINTER'))
# 直接访问指定枚举
print(Season.SPRING)
# 访问枚举成员的变量名
print(Season.SPRING.name)
# 访问枚举成员的值
print(Season.SPRING.value)

# 根据枚举变量名访问枚举对象
print(Season['WINTER']) # Season.WINTER
# 根据枚举值访问枚举对象
print(Season(2)) # Season.SUMMER

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

执行这段代码,会输出如下的结果:

Season.SPRING
SPRING
1
Season.WINTER
Season.SUMMER
SPRING => Season.SPRING , 1
SUMMER => Season.SUMMER , 2
AUTUMN => Season.AUTUMN , 3
WINTER => Season.WINTER , 4

在这段代码中,使用了enum.Enum来定义枚举类型。 Enum是一个类,创建枚举类型的过程相当于创建Enum类的实例,因为调用的是Enum类的构造方法。该构造方法的第1个参数是枚举类的类名,第2个参数是一个元组,用于列出所有枚举值。在定义了上面的 Season枚举类之后,程序可直接通过枚举值进行访问,这些枚举值都是该枚举的成员,每个成员都有name和value两个属性,其中name属性值为该枚举值的变量名,value代表该枚举值的序号(序号通常从1开始)。

程序除可直接使用枚举之外,还可通过枚举变量名或枚举值来访问指定枚举对象,代码如下:

print(Season['WINTER']) # Season.WINTER

根据枚举值访问枚举对象:

print(Season(2)) # Season.SUMMER

此外,Python还为枚举提供了一个 members属性,该属性返回一个dict字典,字典包含了该枚举的所有枚举实例。程序可通过遍历 members属性来访问枚举的所有实例。

如果要定义更复杂的枚举类型,则可通过继承Enum类来派生枚举类,在这种方式下程序就可以为枚举类型额外定义方法了,示例代码:ext_enum.py

import enum
class Orientation(enum.Enum):
    # 为序列值指定value值
    EAST = '东'
    SOUTH = '南'
    WEST = '西'
    NORTH = '北'
    def info(self):
        print(f'这是一个代表方向【{self.value}】的枚举')
print(Orientation.EAST)
print(Orientation.EAST.value)
# 通过枚举变量名访问枚举
print(Orientation['NORTH'])
# 通过枚举值来访问枚举
print(Orientation('北'))
# 调用枚举的info()方法
Orientation.EAST.info()
# 遍历Orientation枚举的所有成员
for name, member in Orientation.__members__.items():
    print(name, '=>', member, ',', member.value)

上面程序通过继承Enum派生了 Orientation枚举类,通过这种方式派生的枚举类可以额外定义方法,如上面的 info方法,也可为枚举指定 value(value的值默认是1、2、3、…)。

虽然此时 Orientation枚举类型的 value是str类型,但该枚举类同样可通过 value来访问特定枚举值,如上面程序中的 Orientation(’北'),这是完全允许的。运行上面代码,可以看到如下输出结果:

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

2. 枚举类的构造方法

枚举也是类,因此枚举也可以定义构造方法。为枚举定义构造方法之后,在定义枚举实例时必须为构造方法参数设置值,代码如下:

示例代码:enum_constructor,py

import enum
class Sex(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
# 访问FEMALE的name
print('FEMALE的name:', Sex.FEMALE.name)
# 访问FEMALE的value
print('FEMALE的value:', Sex.FEMALE.value)
# 访问自定义的cn_name属性
print('FEMALE的cn_name:', Sex.FEMALE.cn_name)
# 访问自定义的desc属性
print('FEMALE的desc:', Sex.FEMALE.desc)

上面程序定义了Sex枚举类,并为它定义了一个构造方法,调用该构造方法需要传入 cn_name和desc两个参数,因此程序使用如下代码来定义 Sex的枚举值。

MALE = '男', '纯爷们'
FEMALE = '女', '纯姐们'

上面代码为MALE枚举指定的 value是"男"和"纯爷们"这两个字符串,其实它们会被自动封装成元组后传给MALE的vaue属性;而且此处传入的"男"和"纯爷们"这两个参数值正好分别传给cn name和desc两个参数。简单来说,枚举的构造方法需要几个参数,此处就必须指定几个值。

运行这段代码,会输出如下内容:

FEMALE的name: FEMALE
FEMALE的value: ('女', '纯姐们')
FEMALE的cn_name: 女
FEMALE的desc: 纯姐们

----------------支持作者请转发本文,也可以加李宁老师微信:unitymarvel,或扫描下面二维码加微信--------


在这里插入图片描述

欢迎关注 极客起源 微信公众号,更多精彩视频和文章等着你哦!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值