From: https://majing.io/posts/10000005131196

枚举类型是在Python3.4新增到Python的标准库。

创建枚举

Python提供了两种方法来创建枚举:

  1. 基于class语法创建枚举
  2. 基于Function API创建枚举

创建枚举首先要导入Enum类

>>> from enum import Enum

基于class语法创建枚举

示例

>>> from enum import Enum
>>> class Color(Enum):
...     red = 1
...     green = 2
...     blue = 3

示例定义以下内容:

  1. 定义了Color的枚举类型。
  2. 定义了枚举类型Color的枚举成员:Color.red,Color.green,Color.blue。
  3. 给每一个枚举成员赋值,如Color.red的值为1。需要注意的是枚举成员的值可以指定为其他类型,没有强制要求是整型。

枚举成员包含了两个属性:name和value

>>>Color.red.name
red
>>>Color.red.value
1

定义字符串类型的值

>>> from enum import Enum
>>> class Color(Enum):
...     red = 'r'
...     green = 'g'
...     blue = 'b'

基于Function API创建枚举

上面基于class创建枚举的示例用Function API可以改写为

>>>from enum import Enum
>>>Color = Enum('Color','red green blue')
>>>list(Color)
[<Color.red:1>,<Color.green:2>,<Color.blue:3>]

Enum函数第一个参数为枚举名。第二个参数为枚举成员列表。

第二个参数表示的枚举成员列表有三种方式:

  1. 使用字符串表示,各成员名使用空格隔开。成员的值从1开始自动递增。
  2. 使用元组表示,成员的值从1开始自动递增。
  3. 使用字典表示,字典可以指定枚举成员的值,其中字典的键位枚举成员名,值为枚举成员的值。

使用字典声明示例

>>>from enum import Enum
>>>Color = Enum('Color',{'red':1,'green':2,'blue':4})

访问枚举成员

访问枚举成员有三种方式:

  1. 使用点号(".")引用
  2. 使用value获取,值对应的枚举成员
  3. 使用枚举成员名

按值访问

>>>Color(1)
<Color.red:1>

按枚举名访问

>>>Color['red']
<Color.red:1>

遍历枚举

枚举支持对它的成员进行遍历

list遍历

>>>list(Color)
[<Color.red:1>,<Color.green:2>,<Color.blue:3>]

for遍历

>>>for color in Color:
...  print(color)

枚举类型的比较

>>> Color.red is Color.red
True
>>> Color.red is Color.blue
False
>>> Color.red is not Color.blue
True

注意枚举成员并非整型,是不能做大小比较,如

>>> Color.red < Color.blue
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: Color() < Color()

只能做相等性比较

>>> Color.blue == Color.red
False
>>> Color.blue != Color.red
True
>>> Color.blue == Color.blue
True
>>> Color.blue == 2
False

定义枚举的方法

由于枚举类型也是一个class,所以也支持给枚举类型定义方法。

示例:

class Mood(Enum):
  funky = 1
  happy = 3   def describe(self):
    # self为枚举成员
    return self.name, self.value   def __str__(self):
    return 'my custom str! {0}'.format(self.value)   @classmethod
  def favorite_mood(cls):
    # cls为枚举类型
    return cls.happy

使用:

>>> Mood.favorite_mood()
<Mood.happy: 3>
>>> Mood.happy.describe()
('happy', 3)
>>> str(Mood.funky)
'my custom str! 1'

定义枚举的子类

定义枚举的子类需要满足:父枚举没有定义任何的枚举成员,此时才允许有子类。

>>> class MoreColor(Color):
...   pink = 17
...
TypeError: Cannot extend enumerations

这是由于Mood已定义了枚举成员,不允许扩展。

Python3.4 枚举类型的使用的更多相关文章

  1. Python3基础系列——枚举类型大揭秘

    为什么使用枚举 枚举类型是定义常量的一种最优选择. 常量的广义概念是:不变化的量 对于常量的通俗比喻--如同大山不被轻而易举地改变 地球上的重力加速度到海枯石烂也会改变 人们使用的常量是时间不很漫长的 ...

  2. Asp.Net 将枚举类型(enum)绑定到ListControl(DropDownList)控件

    在开发过程中一些状态的表示使用到枚举类型,那么如何将枚举类型直接绑定到ListControl(DropDownList)是本次的主题,废话不多说了,直接代码: 首先看工具类代码: /// <su ...

  3. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  4. 第三条:用私有构造器或者枚举类型强化Singleton属性

    1.使用单元素的枚举类型 public enum Singleton implements Serializable { INSTANCE; private String field; public ...

  5. 在WPF中使用变通方法实现枚举类型的XAML绑定

    问题缘起 WPF的分层结构为编程带来了极大便利,XAML绑定是其最主要的特征.在使用绑定的过程中,大家都普遍的发现枚举成员的绑定是个问题.一般来说,枚举绑定多出现于与ComboBox配合的情况,此时我 ...

  6. 窥探Swift之别样的枚举类型

    想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了.Fundation框架和UIKit中的枚举更是数不胜数,枚举可以使你的代码更易阅读并且可以提高可维护性.在 ...

  7. C#枚举类型的常用操作总结

    枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueTy ...

  8. TypeScript中的枚举类型

    TypeScript拓展了Javascript原生的标准数据类型集,增加了枚举类型(enmu)和其他语言一 样 它提供我们一种数字类型的值,用来设置由于辨别的名字和方法 enum Students { ...

  9. Python 中的枚举类型~转

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

随机推荐

  1. CentOS 6 RPM安装包下载地址

    32位系统的RPM安装包的下载地址 http://mirrors.163.com/centos/6/os/i386/Packages/ 64位系统的RPM安装包的下载地址 http://mirrors ...

  2. element ui 手动关闭$notify弹框

    1.需求: 当用户点击 “点击下载” 后,文件导出这个弹框主动消失. 2.解决方案: 如下图所示 (需要注意的是这里的关闭是 点击弹框任意处就会关闭,如果想实现我的需求需要判断一下即可)

  3. SmartBinding与kbmMW#1

    即将发布的kbmMW,实现了SmartBinding,SmartBinding的设计目标是: 必须易于使用 必须最小化或完全删除锅炉板代码.(你看到这里的趋势了吗?... kbmMW从那时开始就是为了 ...

  4. WCF分布式4:客户端访问寄宿在IIS中的WCF服务

    部署过程比较简单,新建一个站点,指向服务的物理路径,设置一个端口.即可. 新建的站点对应一个应用程序池,设置应用程序池中的.NET版本为4.0 写一个测试客户端,访问IIS中的WCF服务,可能会出现, ...

  5. CSS:与input相关的一些样式设置问题

    input是HTML中非常重要,非常常用而又不可替代的元素,在于其相关的样式设置中有时会遇到其他元素不会发生的问题,今天把我印象中的一些小问题和解决方案记录一下. 1.与同行元素上下居中对齐 关于上下 ...

  6. 类 __getitem__ __getattr__ __call__

    __getitem__ 实例虽然能作用于for循环,看起来和list有点像,但是,把它当成list来使用还是不行,要表现得像list那样按照下标取出元素,需要实现__getitem__()方法 __g ...

  7. ps 处理gif

    ps打开gif后,做了修改(去掉了背景色),但之后发现本来是动图的gif不动了. 解决该问题需要注意两点: 一:保存时,要选择保存为web格式 二:在ps中打开时间轴,在时间轴中选中某一帧时,只能有多 ...

  8. Java内省机制

    转自: https://blog.csdn.net/hahalzb/article/details/5972421 1.java内省机制其实通俗的理解为,对自身的进行一个扫描,这个扫描的对象就是我们普 ...

  9. 计算机基础-C语言-16章-数组应用-计算字符串长度

    字符数组的大小并不代表它所包含字符串的长度.需要通过检查结束符,才能判断字符串的实际长度. 数组和指针的关系

  10. js vue 请求

    . Vue 的 GET 请求 var vm = new Vue({ el: '#app', data: { resp: {}, api_url: '/index', }, methods: { get ...