java 枚举类型enum用法_别再说Python没有枚举类型了,好好看看

9848368ed9494690a3ba772106f63d7f

枚举

枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、状态等。

Python 的原生类型(Built-in types)里并没有专门的枚举类型,但是我们可以通过很多方法来实现它,例如字典、类等:

fce1949804564429b730f6ee65bf94e8

python编程

上面两种方法可以看做是简单的枚举类型的实现。

如果只在局部范围内用到了这样的枚举变量是没有问题的。

但问题在于它们都是可变的(mutable),也就是说可以在其它地方被修改从而影响其正常使用:

bcf6c0f8e3d24abe801265e5eb768df1

python编程

通过类定义的枚举甚至可以实例化,变得不伦不类:

7932390d748e4f6a850d0d2456122509

python编程

当然也可以使用不可变类型(immutable),例如元组,但是这样就失去了枚举类型的本意,将标签退化为无意义的变量:

aa2b1ccfb4da494da88aad1adfa66a59

python编程

为了提供更好的解决方案,Python 通过 PEP 435 在 3.4 版本中添加了 enum 标准库,3.4 之前的版本也可以通过 pip install enum 下载兼容支持的库。

enum 提供了 Enum/IntEnum/unique 三个工具,用法也非常简单,可以通过继承 Enum/IntEnum 定义枚举类型,其中 IntEnum 限定枚举成员必须为(或可以转化为)整数类型,而 unique 方法可以作为修饰器限定枚举成员的值不可重复:

46204f512a3d4411990e5febf25ca993

python编程

71e031fdc5684548a234cfc85cc90f98

python编程

更有趣的是 Enum 的成员均为单例(Singleton),并且不可实例化,不可更改:

29c323c145884788b146c9fa19a03ac7

python编程

虽然不可实例化,但可以将枚举成员赋值给变量:

f1260cdbfa924f83b88f2a16be8ec200

python编程

也可以进行比较判断:

73fb09e88cff47f09b04cdb1fbd8fb99

python编程

最后一点,由于枚举成员本身也是枚举类型,因此也可以通过枚举成员找到其它成员:

5315c9cf994341ebabf15687c3095dd3

python编程

但是要谨慎使用这一特性,因为可能与成员原有的命名空间中的名称相冲突:

bc14b129d5264496819db9606d7e82ee

python编程

总结:

enum 模块的用法很简单,功能也很明确,但是其实现方式却非常值得学习。如果你想更深入了解更多 Python 中关于 Class 和 Metaclass 的黑魔法,又不知道如何入手,那么不妨阅读一下 enum 的源码。

后台私信我:腾讯架构资源,获取腾讯架构师整理的大数据学习资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值