定义

在某些情况下,一个类的对象是有限且固定的,比如季节类,它只有 4 个对象;再比如行星类,目前只有 8 个对象。这种实例有限且固定的类,在 Python 中被称为枚举类。
程序有两种方式来定义枚举类:

  1. 直接使用 Enum 列出多个枚举值来创建枚举类。
  2. 通过继承 Enum 基类来派生枚举类。

使用

使用 Enum 列出多个枚举值来创建枚举类

如下程序示范了直接使用 Enum 列出多个枚举值来创建枚举类:

import enum
#定义枚举类
Season = enum.Enum('Season', ('SPRING', 'SUMMER', 'FALL', 'WINTER'))

上面程序使用 Enum() 函数(就是 Enum 的构造方法)来创建枚举类,该构造方法的第一个参数是枚举类的类名;第二个参数是一个元组,用于列出所有枚举值。

在定义了上面的 Season 枚举类之后,程序可直接通过枚举值进行前问,这些枚举值都是该枚举的成员,每个成员都有 name、value 两个属性,其中 name 属性值为该枚举值的变量名,value 代表该枚举值的序号(序号通常从 1 开始)。

例如,如下代码测试了枚举成员的用法:

#直接访问指定枚举对象
print(Season.SPRING) #访问枚举成员的变量名
print(Season.SPRING.name) #访问枚举成员的值
print(Season.SPRING.value)

输出如下:

Season.SPRING
SPRING
1

通过继承 Enum 基类来派生枚举类

也可通过枚举变量名或枚举值来访问指定枚举对象。例如如下代码:

#根据枚举变量名访问枚举对象
print(Season['SUMMER']) //输出Season.SUMMER #根据枚举值访问枚举对象 //输出Season.FALL
print(Season(3))

  

Python 还为枚举提供了一个 __members__ 属性,该属性返回一个 dict 字典,字典包含了该枚举的所有枚举实例。程序可通过遍历 __members__ 属性来访问枚举的所有实例。例如如下代码:

#遍历所有的成员
for name, member in Season.__members__.items():
print(member, '--->', name,'--->', member.value) 输出如下:
Season.SPRING ---> SPRING ---> 1
Season.SUMMER ---> SUMMER ---> 2
Season.FALL ---> FALL ---> 3
Season.WINTER ---> WINTER ---> 4

  

如果要定义更复杂的枚举,则可通过继承 Enum 来派生枚举类,在这种方式下程序就可以为枚举额外定义方法了。例如如下程序:

import enum
class Orientation(enum.Enum):
#为序列指定值
EAST = '东'
SOUTH = '南'
WEST = '西'
NORTH = '北' def info(self):
print('这是一个定义方向为【%s】的枚举'% self.value) print(Orientation.SOUTH)
print(Orientation.SOUTH.value)
#通过枚举变量访问枚举
print(Orientation['WEST']) #通过枚举值访问枚举
print(Orientation('北')) #调用枚举的info()方法
Orientation.EAST.info() #循环遍历Orientation枚举的所有成员
for name, member in Orientation.__members__.items():
print(member, '--->', name, '--->', member.value) 输出如下:
Orientation.SOUTH

Orientation.WEST
Orientation.NORTH
这是一个定义方向【东】的枚举
Orientation.EAST ---> EAST ---> 东
Orientation.SOUTH ---> SOUTH ---> 南
Orientation.WEST ---> WEST ---> 西
Orientation.NORTH ---> NORTH ---> 北

  

上面程序通过继承 Enum 派生了 Orientation 枚举类,通过这种方式派生的枚举类既可额外定义方法,如上面的 info() 方法所示,也可为枚举指定 value(value 的值默认是 1、2、3、…)。

虽然此时 Orientation 枚举的 value 是由类型,但该枚举同样可通过 value 来访问特定枚举,如上面程序中的 Orientation('南'),这是完全允许的。

枚举构造器

枚举也是类,因此枚举也可以定义构造器。为枚举定义构造器之后,在定义枚举实例时必须为构造器参数设置值。例如如下程序:import enum

class Gender(enum.Enum):
MALE = '男', '阳刚之力'
FEMALE = '女', '柔顺之美' def __init__(self, cn_name, desc):
self._cn_name = cn_name
self._desc = desc @property
def desc(self):
return self._desc @property
def cn_name(self):
return self._cn_name #访问FEMALE的name
print('FEMALE的name:', Gender.FEMALE.name) #访问FEMALE的value
print('FEMALE的value:', Gender.FEMALE.value) #访问自定义的cn_name属性
print('FEMALE的cn_name:', Gender.FEMALE.cn_name) # 访问自定义的desc属性
print('FEMALE的desc:', Gender.FEMALE.desc)

  

上面程序定义了 Gender 枚举类,并为它定义了一个构造器,调用该构造器需要传入 cn_name 和 desc 两个参数,因此程序使用如下代码来定义 Gender 的枚举值。

MALE = '男', '阳刚之力'
FEMALE = '女', '柔顺之美

上面代码为 MALE 枚举指定的 value 是‘男’和‘阳刚之力’这两个字符串,其实它们会被自动封装成元组后传给 MALE 的 value 属性;而且此处传入的‘男’和‘阳刚之力’ 这两个参数值正好分别传给 cnname 和 desc 两个参数。简单来说,枚举的构造器需要几个参数,此处就必须指定几个值。

输出如下:

FEMALE的name: FEMALE
FEMALE的value: ('女', '柔顺之美')
FEMALE的cn_name: 女
FEMALE的desc: 柔顺之美

  

python3 枚举定义和使用的更多相关文章

  1. [改善Java代码]推荐使用枚举定义常量

    枚举和注解都是在Java1.5中引入的,虽然他们是后起之秀,但是功能不容小觑,枚举改变了常量的声明方式,注解耦合了数据和代码. 建议83:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或 ...

  2. 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)

    提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...

  3. UIView的几个枚举定义

    UIView是iOS开发最主要的视图,非常多控件都是继承它,掌握当中的几个基本枚举定义,有利益理解视图的载入和參数差别. 一.UIViewAnimationCurve UIView的基本动画变化规律 ...

  4. python3 枚举enum定义和使用

    两种方式定义枚举类: 1.直接使用Enum列出多个枚举值来创建枚举类. 2.通过集成Enum基类派生枚举类. 程序示范: 1.直接使用Enum列出多个枚举值来创建枚举类. from enum impo ...

  5. 一个C++宏定义与枚举定义重复的编译错误

    C++的开发效率低是众所周知的,原因比如有: 语言复杂度高 编译效率低 工具链不够完整高效(尤其是linux下) 另外一个恐怕是不少编译错误让人摸不着头脑,今天碰到一个,举个例子: #include ...

  6. oc中的枚举定义

    typedef NS_ENUM(类型,枚举名){        枚举名+值名,       枚举名+值名,}; 该方法定义的枚举,OC会自动把其转换成合适当前版本的枚举.如果枚举值可合并的话 NS_E ...

  7. 提高Java代码质量:使用枚举定义常量(转)

    一.分析  常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一种常量声明方式,枚举常量.代码如下: enum ...

  8. C++中枚举定义运算符

    由于枚举也是用户定义类型,所以是可以定义运算符, 如: enum Day {sun, mon, tue, wen, thu, fri, sat}; Day& operator++(Day&am ...

  9. iOS中枚举定义的三种方式

    最简单的方式 typedef enum{ num1 = 0, num2 = 1, num3 = 2 }num; 同时我们还可以使用NS_ENUM的方式定义枚举 typedef NS_ENUM (NSI ...

随机推荐

  1. Java NIO和IO的区别

    下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异. 复制代码 代码如下: IO NIO面向流 面向缓冲阻塞IO 非阻塞IO无 选择器 面向流与面向缓冲 Java NIO ...

  2. js把文字中的空格替换为横线

    问题描述 把一个字符串里的所有空格转换为横线 var str = "hello word"; var params=str.replace(/\ /g, "-" ...

  3. 逆向常见加密算法值BlowFish算法

    伪c代码简单记录 伪c代码实现BlowFish加密 sub_4012F0(&v22, &v5, &v6); ^ | do { v7 = *v6 ^ v3; v3 = v4 ^ ...

  4. 如何打包ANE

    来源:http://blog.sina.com.cn/s/blog_6471e1bb01012aql.html 首先先说一下打包ANE必须的部件: 1.ActionScript扩展库SWC 2.本机扩 ...

  5. iview 标题内边距过大; 调整iview 单元格内边距、行高;

    1css代码: /*调整table cell间隔和行高*/ .ivu-table-cell { padding-left: 1px; padding-right: 1px; } .ivu-table- ...

  6. django后台xadmin如下配置(小结)

    django-admin文档:https://xadmin.readthedocs.io/en/latest/index.html目录: 1.xadmin基本配置 2.配置后台显示的模型类 3.后台注 ...

  7. 01-HTML基本介绍

    本篇主要介绍HTML相关标签的使用,以及其常用标签的作用等介绍. 一.HTML的介绍 HTML是 HyperText Mark-up Language 的首字母简写,意思是超文本标记语言,超文本指的是 ...

  8. [新手必备]Python 基础入门必学知识点笔记

    Python 作为近几年越来越流行的语言,吸引了大量的学员开始学习,为了方便新手小白在学习过程中,更加快捷方便的查漏补缺.根据网上各种乱七八糟的资料以及实验楼的 Python 基础内容整理了一份极度适 ...

  9. Please provide compiled classes of your project with sonar.java.binaries property

    是因为一个jar包版本的原因,sonar-java-plugin-5.1.0.13090.jar 需要降级 https://repo.maven.apache.org/maven2/org/sonar ...

  10. linux远程工具

    实际工作中,linux系统都不会在我们自己的电脑上,linux系统安装在机房的服务器上,我们操作linux不可能跑到机房去,所以我们需要有一个工具,能在公司通过网络远程连接到机房的linux服务器上 ...