在Python中应用枚举类,只需要这1个理由就够了!

枚举类在Java中并不陌生,本文就来讲解一下为什么要在Python中应用枚举类。

试想一个问题,假如你在项目中处理通过Rest API请求回来的JSON数据,其中有一个数据格式如下:

{
  metrics: 'speed',
  value: 20,
  weekday: 'Mon'
}

你需要处理数据,把字符串型的周几转化成数值类型的1、2、3、4、5、6、7,你该怎么做?

Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
Sun = 7

以定义常量的方式去预先定义一个一一对应的映射关系。

如果稍微有一定的Python开发经验的,大多数会选择字典的形式进行解决:

weekday = {
  'Mon': 1
  'Tue': 2
  'Wed': 3
  'Thu': 4
  'Fri': 5
  'Sat': 6
  'Sun': 7
}

通过键值的方式去取对应的数值型值。

但是,我在另外一篇文章中(从青铜到王者,一文教你节省90%内存占用)介绍过,Python中字典是一种非常占用内存的数据存储方式。

如果读过我的那篇文章,可能会产生很多新的想法,例如,用类的方式去实现枚举关系,

class Weekday:
  Mon = 1
  Tue = 2
  Wed = 3
  Thu = 4
  Fri = 5
  Sat = 6
  Sun = 7

但是,上述这些方式在数据持久化扩展性方面并不是最理想的解决方案。

如果有一定的Java开发经验,面对这样的问题,肯定会马上想起一个概念--枚举类

enum Weekday {
    MON(1, "星期一"),
    TUE(2, "星期二"),
    WED(3, "星期三"),
    THU(4, "星期四"),
    FRI(5, "星期五"),
    SAT(6, "星期六"),
    SUN(7, "星期七");

    publicfinalint intValue;
    publicfinal String chinese;

    Weekday(int intValue, String chinese) {
        this.intValue = intValue;
        this.chinese = chinese;
    }
}

通过下面方式,就可以访问枚举类中的值,

publicclass App {
    public static void main(String[] args) {
        Weekday day = Weekday.MON;
        System.out.println(day.intValue);
        System.out.println(day.chinese);
    }
}

Java中枚举类具有众多优势,例如,安全、规范,使得它备受欢迎。

那么,Python中是否也可以使用枚举类解决类似的枚举问题?

答案是肯定的。

Python中提供了标准的enum库,通过对它的调用和继承,就可以实现Python枚举类。

实现方式有2种。

方式1:类继承

# demo.py

from enum import Enum

class Weekday(Enum):
  Mon = 1
  Tue = 2
  Wed = 3
  Thu = 4
  Fri = 5
  Sat = 6
  Sun = 7
  
print(Weekday)
print(Weekday.Mon)
print(Weekday.Mon.value)

输出结果看一下,

$ python demo.py
<enum 'Weekday'>
Weekday.Mon
1

方式2:定义变量

当每个枚举的值是递增、且不重要时,可以使用常量名作为字符串直接调用Enum类,

Weekday = Weekday('Weekday', ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'])
for name, member in Weekday.__members__.items():
	print(name, member, member.value)

下面,输出结果看一下,

$ python demo.py
('Mon', <Weekday.Mon: 1>, 1)
('Tue', <Weekday.Tue: 2>, 2)
('Wed', <Weekday.Wed: 3>, 3)
('Thu', <Weekday.Thu: 4>, 4)
('Fri', <Weekday.Fri: 5>, 5)
('Sat', <Weekday.Sat: 6>, 6)
('Sun', <Weekday.Sun: 7>, 7)

我们也可以通过下面方式访问对应日期的值,

sunday = Weekday.Sun.value

到这里,枚举类的使用就讲解完了。

Python是一门相对简单的编程语言,这里所谓的简单是入门简单,真正想成为一名高阶的Python开发者,有很多知识是书籍上都没有的。

就如同本文讲解的枚举类,或许你定义常量、使用字典都可以解决这个问题。但是,当遇到枚举问题时,再使用这些入门级的方法,对于代码的效率、可读性都会大打折扣。因此,当遇到一个需求,不应该把实现功能当成最终目标,而是应该把实现高性能系统当成最终追求。

我记得看过雷军的一个采访,他曾提到写的代码像诗一样,虽然网络上对他这句话的调侃很多。但是,我认为这是作为程序员应该有的追求,也是绝大多数程序员做不到的一点。


 干货推荐

为了方便大家,我花费了半个月的时间把这几年来收集的各种技术干货整理到一起,其中内容包括但不限于Python、机器学习、深度学习、计算机视觉、推荐系统、Linux、工程化、Java,内容多达5T+,我把各个资源下载链接整理到一个文档内,目录如下:

所有干货送给大家,希望能够点赞支持一下!

https://http://pan.baidu.com/s/1eks7CUyjbWQ3A7O9cmYljA (提取码:0000)

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值