0. 本文来历

  • 我当时就比较好奇它的顺序和英文的对应关系,肯定是写死的,找了下就发现在源码sorter.py中定义了一个dict如下

     orders_map = {
         "first": 0,
         "second": 1,
         "third": 2,
         "fourth": 3,
         "fifth": 4,
         "sixth": 5,
         "seventh": 6,
         "eighth": 7,
         "last": -1,
         "second_to_last": -2,
         "third_to_last": -3,
         "fourth_to_last": -4,
         "fifth_to_last": -5,
         "sixth_to_last": -6,
         "seventh_to_last": -7,
         "eighth_to_last": -8,
     }
  • 于是乎顺道看了下它其他的源代码,在settings这个模块中有如下一段

     class Scope(Enum):
         CLASS = 1
         MODULE = 2
         SESSION = 3
     ​
     ​
     class Settings:
         """Holds all configuration settings."""
         valid_scopes = {
             "class": Scope.CLASS,
             "module": Scope.MODULE,
             "session": Scope.SESSION,
        }
        ...
  • 之前在python中使用枚举更多是用来遍历容器(确切的说列表,虽说它支持多数sequence)

     list1 = [1,3,5,7]
     for i,v in enumerate(list1):
         print(f'第{i+1}个元素是{v}')
         
     # 输出
     第1个元素是1
     第2个元素是3
     第3个元素是5
     第4个元素是7

1. 什么是枚举enumeration

枚举模块(enum)是Python 3.4添加的功能,什么是枚举(enumeration)呢?根据官方文档:

An enumeration is a set of symbolic names bound to unique, constant values. Within an enumeration, the values can be compared by identity, and the enumeration itself can be iterated over

即枚举代表了一系列互不相同的常量,这一系列常量可以通过identity互相比较,也可以进行迭代。

 from enum import Enum
 # 比如一个环境的定义
 class Env(Enum):
  UI = 0
  API = 1
  PERFORMANCE = 2
  COMP = 3
 ​
 ​

2. 枚举的应用场景

PEP 435中的介绍

The properties of an enumeration are useful for defining an immutable, related set of constant values that may or may not have a semantic meaning.

在Python中,使用枚举的目的主要是方便常量的管理,方便记忆的同时使代码更加简洁易读

举个例子,在代码中通常使用不同的整数代表一些常量。比如用0代表UI,1代表API等。但是带来的麻烦是:写代码/阅读代码的人极有可能不明白这个0背后的意义。用枚举就可以解决这个问题。

而且注意:枚举的value一旦确定,是不可更改的,这样就保证了常量的安全

3. 使用

name和value属性

  • 类名.Field.name 访问字段名

  • 类名.Field.value 访问字段值(更常用)

 from enum import Enum
 ​
 ​
 # 比如一个环境的定义
 class Env(Enum):
     UI = 0
     API = 1
     PERFORMANCE = 2
     COMP = 3
 ​
 # 典型的访问 类名.Field.name
 print(Env.COMP.name)   # COMP
 print(Env.COMP.value)  # 3
 ​

不可变

  • 有点常量的感觉,但这点是非常有优势的

 Env.COMP.value = 4
 Traceback (most recent call last):
   File "D:\enum_test.py", line 14, in <module>
     Env.COMP.value = 4
   File "D:\Python39\lib\types.py", line 182, in __set__
     raise AttributeError("can't set attribute")
 AttributeError: can't set attribute

不仅仅支持数字

 class Config(Enum):
     HOST = 'https://www.baidu.com'
     DB = '192.168.1.1'
     PORT = 3306
     USERNAME = 'ADMIN'
     PASSWORD = '123456'
 ​
 ​
 print(Config.HOST.value)  # https://www.baidu.com

unique 装饰器

  • 要对enum的item进行唯一性限制可以用该装饰器

     from enum import Enum,unique
     ​
     class Env1(Enum):
         MONDAY = 1
         FLAG = 1
     ​
     print(Env1.FLAG.value)  # 不加装饰器可以重复
     ​
     @unique
     class Env2(Enum):
         MONDAY = 1
         FLAG = 1
         
     Traceback (most recent call last):
       File "D:\enum_test.py", line 10, in <module>
         class Env2(Enum):
       File "D:\Python39\lib\enum.py", line 1013, in unique
         raise ValueError('duplicate values found in %r: %s' %
     ValueError: duplicate values found in <enum 'Env2'>: FLAG -> MONDAY

4. 参考

  • enum还有一些其他的功能,比如

    • auto:自动产生一些内容

       >>> from enum import Enum, auto
       >>> class Color(Enum):
       ...     RED = auto()
       ...     BLUE = auto()
       ...     GREEN = auto()
    • IntEnum继承自int和Enum,它只允许枚举的value为整数型

    • Flag和Enum的不同在于:

      • Flag的value只能是整数;

      • Flag支持位运算符(&与、|或、^异或、~取反)

    • IntFlag继承自int和Flag,因此int和Flag的特性它都有,即

      • IntFlag的value只能是整数;

      • IntFlag支持位运算符(&与、|或、^异或、~取反)

      • IntFlag还能当成整数用,比如和整数进行运算,索引等等

  • 更多信息可以参考官文:https://docs.python.org/3.9/library/enum.html?highlight=enum#module-enum

Python中的枚举类enum的更多相关文章

  1. Python中使用枚举类

    开发中我们经常定义常量, 其实有更好的方法:为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例.Python中提供了Enum类来实现这个功能: from enum im ...

  2. java中的枚举类enum

    enum SeasonEnum {//枚举类: 本类规定了SeasonEnum(季节)类只能有四个对象SPRING,SUMMER,AUMUTN,WINTER //创建枚举类的的四个对象SPRING,S ...

  3. Python 中的枚举类型~转

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

  4. Java枚举类enum

    枚举类enum是JDK1.5引入的,之前都是用public static final int enum_value来代替枚举类的.枚举类enum是一种特殊的类,它默认继承了类java.lang.Enu ...

  5. VM页面中遍历枚举类

    1)自定义的枚举类如下所示: public enum BusType { MID_SMALL(1, "中小件"), FRESH(2, "生鲜"), GLOBAL ...

  6. 全面解读Java中的枚举类型enum的使用

    这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...

  7. Java基础(七)泛型数组列表ArrayList与枚举类Enum

    一.泛型数组列表ArrayList 1.在Java中,ArrayList类可以解决运行时动态更改数组的问题.ArrayList使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而 ...

  8. 在ASP.Net Core 中使用枚举类而不是枚举

    前言:我相信大家在编写代码时经常会遇到各种状态值,而且为了避免硬编码和代码中出现魔法数,通常我们都会定义一个枚举,来表示各种状态值,直到我看到Java中这样使用枚举,我再想C# 中可不可以这样写,今天 ...

  9. C# 中的枚举类型 enum (属于值类型)

    原文 C# 中的枚举类型 enum (属于值类型) C# 支持两种特殊的值类型:枚举和结构. 声明枚举:声明时要声明所有可能的值. using System; using System.Collect ...

  10. Python中的元类(metaclass)

    推荐+收藏:深刻理解Python中的元类(metaclass) 做一些笔记学习学习: 在大多数编程语言中,类就是用来描述如何生成一个对象的代码段,在Python中类也是一个对象,这个(类)对象自身拥有 ...

随机推荐

  1. C语言指针重点

    指针 指针与一维数组 万能公式 p[i] = *(p+i) = (i+p) = i[p] &p[i] == &((p+i))== p+i 指针与二维数组 二维数组万能公式: ((p+i ...

  2. .NET MAUI 安卓应用开发初体验

    一..NET MAUI开发环境搭建&安卓SDK和安卓模拟器安装提示网络连接失败问题解决 引言 本节目标是帮助第一次搭建.NET MAUI开发环境,在下载安卓SDK和安卓模拟器过程中一直提示网络 ...

  3. 包管理器pacman常用方法

    详见[pacman(简体中文) - ArchWiki]:https://wiki.archlinux.org/title/Pacman_(简体中文) 更新系统: pacman -Syu 对整个系统进行 ...

  4. 第二十五节:scrapy爬虫识别验证码(四)手绘验证码识别

    一.介绍 今天主要介绍的是微博客户端在登录时出现的四宫格手绘验证码,不多说直接看看验证码长成什么样.        二.思路 1.由于微博上的手绘验证码只有四个宫格,且每个宫格之间都有有向线段连接,所 ...

  5. Golang反射修改变量值

    1. 前言 前面的随笔Golang反射获取变量类型和值分享了如何通过反射获取变量的类型和值, 也就是Golang反射三大定律中的前两个,即从interface{}到反射对象和从反射对象到interfa ...

  6. 【kafka】JDBC connector进行表数据增量同步过程中的源表与目标表时间不一致问题解决

    〇.参考资料 一.现象 1.Oracle源表数据 2.PG同步后的表数据 3.现象 时间不一致,差了8个小时 4.查看对应的connector信息 (1)source { "connecto ...

  7. 【Java EE】Day06 JDBC连接池介绍、C3P0连接池实现、Druid连接池实现、JDBCTemplate

    一.数据库连接池介绍 1.引入 之前:每次都要获取连接释放连接 现在:连接重复使用 2.概念: 存放数据库连接的容器 3.实现 DataSource接口 三种实现 标准实现 连接池实现 C3P0 Dr ...

  8. Hexo博客搭建和简单部署

    title: Hexo博客搭建和简单部署 date: 2020-03-02 12:00:00 categories: - [IT,博客] - [IT,软件,程序] - [IT,软件,搭建与配置] ta ...

  9. 常用BOM操作 DOM操作 事件 jQuery类库

    目录 BOM操作 常用BOM操作 三种弹出框 alert confirm prompt 定时任务 setTimeout 循环定时 setInterval DOM操作 查找标签 直接查找 间接查找 操作 ...

  10. Java程序员除了做增删改查还能干嘛?

    就以Java后端开发为例,说说不同级别程序员干的事情. 1 初级开发,大概是有3年Java开发经验. 22年底,上海,这批程序员如果学历是本科,薪资一般是8k到2w,当然如果能进好公司或互联网大厂,薪 ...