理解枚举替代实现的缺陷

本文回顾了Python中枚举类型的实现历程,从早期的类属性、函数和namedtuple方法,到引入第三方模块flufl.enum,直至Python3.4中正式加入枚举Enum。探讨了不同实现方式的特点及局限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python3.4以前并不提供枚举类型,于是人们利用Python的动态性这个特征,想出了枚举的各种替代实现方式。

  • 使用类属性
class Seasons:
    Spring, Summer, Autumn, Winter = range(4)


print(Seasons.Summer)   # 1
  • 借助函数
def enum(*args, **kwargs):
    return type("Enum", (object,),
                dict(zip(args, range(len(args))), **kwargs))


Seasons = enum("Spring", "Summer", "Autumn", "Winter")
print(Seasons.Summer)   # 1
  • 使用collections.namedtuple
from collections import namedtuple

Seasons = namedtuple('Seasons', 'Spring Summer Autumn Winter')._make(range(4))

print(Seasons.Summer)   # 1

显然,这些替代实现有其不合理的地方。

  • 允许枚举值重复

  • 支持无意义的操作

实际上Python2.7以后的版本还有另外一种替代选择——使用第三方模块flufl.enum,它包含两种枚举类:一种是Enum,只要保证枚举值唯一即可,对值的类型没限制;还有一种是IntEnum,其枚举值为int型。

from flufl.enum import Enum


class Seasons(Enum):
    Spring = 1
    Summer = 2
    Autumn = 3
    Winter = 4


Season = Enum('Seasons', 'Spring Summer Autumn Winter')

# flufl.enum不支持枚举元素的比较
print(repr(Season.Autumn))  # <EnumValue: Seasons.Autumn [value=3]>

# 可以直接使用value属性获取枚举元素的值
print(Season.Autumn.value)  # 3

Python3.4中根据PEP435的建议加入了枚举Enum,其实现主要参考实现flufl.enum,但两者之间还是存在一些差别,如flufl.enum允许枚举继承,而Enum仅在父类没有任何枚举成员的时候才允许继承等。

(最近更新:2019年05月20日)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值