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

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.创建一个枚举类

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

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

说明:

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

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

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

  1. >>> print(Color.RED)
  2. Color.RED

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

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

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

  1. >>> type(Color.RED)
  2. <enum 'Color'>
  3. >>> isinstance(Color.GREEN, Color)
  4. True
  5. >>>

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

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

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

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

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

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

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

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

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

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

  1. >>> member = Color.RED
  2. >>> member.name
  3. 'RED'
  4. >>> member.value
  5. 1

4.复用枚举成员和值

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

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

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

  1. >>> class Shape(Enum):
  2. ... SQUARE = 2
  3. ... DIAMOND = 1
  4. ... CIRCLE = 3
  5. ... ALIAS_FOR_SQUARE = 2
  6. ...
  7. >>> Shape.SQUARE
  8. <Shape.SQUARE: 2>
  9. >>> Shape.ALIAS_FOR_SQUARE
  10. <Shape.SQUARE: 2>
  11. >>> Shape(2)
  12. <Shape.SQUARE: 2>

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

5.确保唯一的枚举值

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

@enum.unique

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

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

6.使用自动赋值

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

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

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

  1. >>> class AutoName(Enum):
  2. ... def _generate_next_value_(name, start, count, last_values):
  3. ... return name
  4. ...
  5. >>> class Ordinal(AutoName):
  6. ... NORTH = auto()
  7. ... SOUTH = auto()
  8. ... EAST = auto()
  9. ... WEST = auto()
  10. ...
  11. >>> list(Ordinal)
  12. [<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. 第十二篇 requests模拟登陆知乎

    了解http常见状态码 可以通过输入错误的密码来找到登陆知乎的post:url 把Headers拉到底部,可以看到form data _xsrf是需要发送的,需要发送给服务端,否则会返回403错误,提 ...

  2. 关于HTML 5 canvas 的基础教程

    HTML 5 规范引进了很多新特性,其中最令人期待的之一就是 canvas 元素.HTML 5 canvas 提供了通过 JavaScript 绘制图形的方法,此方法使用简单但功能强大.每一个canv ...

  3. Tomcat爆破

    把输入的账户和密码包起来 选择第三个模式 第一个添加用户名 第二个添加: 第三个添加密码 选择编码格式 取消打钩

  4. apache + php 无法访问redis

    1.在有扩展的情况下 2.测试连接 <?php $redis=new Redis(); $redis->connect('127.0.0.1',6379); echo "succ ...

  5. fedora28 安装automake

    yum install automake yum install hg //版本管理

  6. 【luoguP3701】「伪模板」主席树

    description byx和诗乃酱都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 很快,这棵树就开花结果了.byx和诗乃 ...

  7. look at me

    I would bet my life, like I bet my heart我以生命与真心担保That you were the one, baby你就是我的命中注定I've never been ...

  8. Zookeeper_Paxos算法

    Paxos算法 算法简介 Paxos算法是莱斯利-兰伯特在1990年提出的一种基于消息传递的.具有容错性的一致性算法,Google Chubb(分布式锁服务)的作者Mike Burrwos说过,世上只 ...

  9. Delphi ADOQuery

    Delphi ADOQuery procedure TForm1.Button1Click(Sender: TObject); var A: Array of String;//定义动态数组 Inde ...

  10. NX二次开发-UFUN创建倒圆UF_MODL_create_blend

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建块 UF_FEATURE_SIGN S ...