枚举是绑定到唯一的常量值的一组符号名称(成员)。在枚举中,成员可以通过身份进行比较,枚举本身可以迭代。

1.Enum模块

该模块定义了四个枚举类,可用于定义唯一的名称和值集:Enum,IntEnum,Flag和IntFlag。它还定义了一个装饰器,unique()和一个helper,auto。

Content Description  Remarks 
class enum.Enum  创建枚举实例的基类  
class enum.IntEnum  用于创建同属于int子类枚举常量的基类                           
class enum.IntFlag 用于创建枚举常量的基类,可以使用按位运算符组合而不会丢失其IntFlag成员资格。 IntFlag成员也是int的子类。 New in version 3.6
class enum.Flag 用于创建枚举常量的基类,可以使用按位运算符组合而不会丢失其IntFlag成员资格。 New in version 3.6
unique()                    枚举类装饰器,用于确保任何一个值只有一个名字与其绑定  
class enum.auto 实例被替换为枚举成员的合适值 New in version 3.6

2.创建一个枚举类

创建一个枚举类很简单,如下所示:

>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
...

说明:

(1) 枚举类得成员值可以是任何值,比如int,str等。如果确定值不重要,你可以使用auto实例来产生一个合适值。但是混用auto实例和其他值一定要慎重。

(2) 类Color是一个枚举。属性Color.RED,Color.GREEN等是枚举成员(或枚举成员),并且是函数常量。枚举成员具有名称和值(Color.RED的名称为RED,Color.BLUE的值为3等)

枚举成员拥有易读的字符表现形式:

>>> print(Color.RED)
Color.RED

利用repr()函数可以得到更多信息:

>>> print(repr(Color.RED))
<Color.RED: 1>

枚举成员的类型是它所属的枚举:

>>> type(Color.RED)
<enum 'Color'>
>>> isinstance(Color.GREEN, Color)
True
>>>

枚举成员也有一个只包含其项目名称的属性:

>>> print(Color.RED.name)
RED

枚举支持迭代,按定义顺序:

>>> class Shake(Enum):
... VANILLA = 7
... CHOCOLATE = 4
... COOKIES = 9
... MINT = 3
...
>>> for shake in Shake:
... print(shake)
...
Shake.VANILLA
Shake.CHOCOLATE
Shake.COOKIES
Shake.MINT
枚举成员可以是哈希的,所以它们可以在字典和集合中使用:
>>> apples = {}
>>> apples[Color.RED] = 'red delicious'
>>> apples[Color.GREEN] = 'granny smith'
>>> apples == {Color.RED: 'red delicious', Color.GREEN: 'granny smith'}
True

3.程序访问枚举成员及其属性

有时候以编程方式访问成员函数(即Color.RED不会执行的情况是有用的,因为在程序写入时间没有确切的颜色)。枚举允许这样的访问:

>>> Color(1)
<Color.RED: 1>
>>> Color(3)
<Color.BLUE: 3>

如果你想用名字访问枚举成员,可以使用项目访问:

>>> Color['RED']
<Color.RED: 1>
>>> Color['GREEN']
<Color.GREEN: 2>

如果你有一个枚举成员,并且需要它的名字和值:

>>> member = Color.RED
>>> member.name
'RED'
>>> member.value
1

4.复用枚举成员和值

两个枚举成员拥有相同的名字是不合法的:

>>> class Shape(Enum):
... SQUARE = 2
... SQUARE = 3
...
Traceback (most recent call last):
...
TypeError: Attempted to reuse key: 'SQUARE'

但是,两个枚举成员允许拥有相同的值。如果两个成员A和B有相同的值(并且A先定义),B是A的一个别名。根据值查询A和B都会放回A。根据名字查询B也会返回A。

>>> class Shape(Enum):
... SQUARE = 2
... DIAMOND = 1
... CIRCLE = 3
... ALIAS_FOR_SQUARE = 2
...
>>> Shape.SQUARE
<Shape.SQUARE: 2>
>>> Shape.ALIAS_FOR_SQUARE
<Shape.SQUARE: 2>
>>> Shape(2)
<Shape.SQUARE: 2>

注意:尝试去创建一个与已定义属性同名的成员或者尝试创建一个与成员同名的方法是不允许的。

5.确保唯一的枚举值

默认情况下,枚举允许多个名称作为同一个值的别名。当不需要此行为时,可以使用以下装饰器来确保每个值在枚举中仅使用一次:

@enum.unique

专门用于枚举的类装饰器。它搜索枚举的__members__收集它发现的任何别名;如果有的话,会发现ValueError带有细节:

>>> from enum import Enum, unique
>>> @unique
... class Mistake(Enum):
... ONE = 1
... TWO = 2
... THREE = 3
... FOUR = 3
...
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE

6.使用自动赋值

如果确切的值不重要,您可以使用auto:

>>> from enum import Enum, auto
>>> class Color(Enum):
... RED = auto()
... BLUE = auto()
... GREEN = auto()
...
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

auto产生的值由_generate_next_value_()函数产生,该函数可以被重写:

>>> class AutoName(Enum):
... def _generate_next_value_(name, start, count, last_values):
... return name
...
>>> class Ordinal(AutoName):
... NORTH = auto()
... SOUTH = auto()
... EAST = auto()
... WEST = auto()
...
>>> list(Ordinal)
[<Ordinal.NORTH: 'NORTH'>, <Ordinal.SOUTH: 'SOUTH'>, <Ordinal.EAST: 'EAST'>, <Ordinal.WEST: 'WEST'>]

python3 enum模块的更多相关文章

  1. python3 enum模块的应用

    python枚举模块的学习 ps:小编刚开始学习没多久,部分资源来源于其他网友,如有出错,麻烦联系修改哈,互帮互助,共同进步 一.枚举与字典类型 字典类型的缺点:1.值可变 2.没有防止相同标签的功能 ...

  2. [转]python3之模块psutil系统性能信息

    转自:https://www.cnblogs.com/zhangxinqi/p/9106265.html 阅读目录 1.psutil模块安装 2.获取CPU信息 3.内存信息 4.磁盘信息 5.网络信 ...

  3. 【转】Python3 configparse模块(配置)

    [转]Python3 configparse模块(配置) ConfigParser模块在python中是用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(s ...

  4. Python3 operator模块关联代替Python2 cmp() 函数

    Python2 cmp() 函数 描述 cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1. Python ...

  5. Python3 logging 模块

    Python3 logging模块 日志模块: 用于便捷记录日志且线程安全的模块 CRITICAL = 50 FATAL = CRITICAL ERROR = 40 WARNING = 30 WARN ...

  6. python3 selenium模块Chrome设置代理ip的实现

    python3 selenium模块Chrome设置代理ip的实现 selenium模块Chrome设置代理ip的实现代码: from selenium import webdriver chrome ...

  7. python3 导入模块

    python3导入模块和python2  有些不同   需要指定相对目录 如,在Project下有一个nlp目录里面有一个ltp模块,则 from n1.ltp import Clawer

  8. python3之模块

    1.python3模块 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用 python 标准库的方法. 模块让你能够有逻辑地 ...

  9. Python3数据库模块(sqlite3,SQLite3)

    一.sqlite命令 创建数据库:在控制台sqlite3 name .databases     查看数据库 .tables            查看表格名 databaseName .dump & ...

随机推荐

  1. 自定义可点击的ImageSpan并在TextView中内置“View“

    有的时候可能想在TextView中添加一些图片,比如下图,发短信输入联系人时,要把联系人号码换成一个图片,但这个图片无法用固定的某张图,而是根据内容进行定制的,这更像一个view. 当然,如果你不是v ...

  2. linux常用命令 满足99%的开发需要

    1.# 表示权限用户(如:root),$ 表示普通用户开机提示:Login:输入用户名password:输入口令 用户是系统注册用户成功登陆后,可以进入相应的用户环境.退出当前shell,输入:exi ...

  3. C#跨线程访问(二)----thread参数、回调传参数

    一.单个参数(封箱也可实现多参数) class B  {      public static void Main()      {          Thread t = new Thread(ne ...

  4. 在VisualGDB中配置预编译头加快编译速度

    今天是中秋佳节,但是写完已经是第二天凌晨了,还是祝大家中秋快乐! VS对C++的支持相较GCC太弱了,连续几个VS版本对C++的改进都很小.很少.对Cpper也许是一种痛,我们也许希望能使用VS的强大 ...

  5. docker一键部署zookeeper

    version: '3.1' services: zoo1: image: zookeeper:3.4.11 restart: always hostname: zoo1 container_name ...

  6. vscode编程nodejs初始安装

    nodejs官网 http://nodejs.cn/ 1.安装nodejs,记得安装时勾选配置路径 在cmd中输入node,进去node环境即为安装成功. 2.安装vscode,并安装插件node e ...

  7. 使用Process子类创建进程

    #_author:来童星#date:2019/12/17# 使用Process子类创建进程from multiprocessing import Processimport timeimport os ...

  8. Spring Data之Example<>

    简单CRUD之Example动态查询 简单介绍 (部分口水话,部分来自网络,代码永远自产) 使用过Spring全家桶的各位大佬应该都知道,Spring Data这个是Spring对持久层框架的封装,比 ...

  9. 在fedora下面安装ftp服务器

    Fedora版本:Fedora 12 1. 安装vsftp #yum install vsftpd 一路yes,最后提示安装成功. 2. 配置vsftpd.conf. #vi /etc/vsftpd/ ...

  10. 关于group by的用法

    重新回顾并理解group by. 首先设计一张表,表名为test 然后执行以下SQL语句: select name from test group by name 获得执行结果: 可是为了能够更好的理 ...