定义

在某些情况下,一个类的对象是有限且固定的,比如季节类,它只有 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_nameself._desc = desc@propertydef desc(self):return self._desc@propertydef 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: 柔顺之美

  

转载于:https://www.cnblogs.com/yjt1993/p/11104080.html

python3 枚举定义和使用相关推荐

  1. python3 枚举_Python3枚举类如何处理重复名称?

    筛选重复的名称,相信对于各位小伙伴不是什么难事.那么,大家发现有重复的名称会如何进行解决呢?作为一位python的粉丝,小编优先选择的事这类的方法.在处理重复名称方面,小编选择的是用python3里的 ...

  2. UIView的几个枚举定义

    UIView是iOS开发最基本的视图,很多控件都是继承它,掌握其中的几个基本枚举定义,有利益理解视图的加载和参数区别. 一.UIViewAnimationCurve UIView的基本动画变化规律 t ...

  3. 使用枚举定义常量更好点儿

    大家好,欢迎来到雄雄的小课堂,昨天给大家分享的是"java中的Queue队列的用法示例",今天,分享的主题是"java中,推荐使用枚举定义常量". 前言:常量, ...

  4. c语言 枚举定义变量,C语言之枚举的定义以及测试

    #include /*   定义方法1:只定义枚举类型,不定义变量 enum week { SUN,        // SUN = 0 MON,        // MON = 1; TUE, WE ...

  5. 【swift3.0】【枚举定义的不同方式】

    为什么80%的码农都做不了架构师?>>>    贡献作者 -[XJDomain] 博客XJ:  https://my.oschina.net/shengbingli/blog Git ...

  6. python3 批量定义多个变量_Python 3.8 新功能大揭秘

    Python 3.8是Python语言的最新版本,它适合用于编写脚本.自动化以及机器学习和Web开发等各种任务.现在Python 3.8已经进入官方的beta阶段,这个版本带来了许多语法改变.内存共享 ...

  7. python3怎么定义long_python3 整数类型PyLongObject 和PyObject源码分析

    python3 整数类型PyLongObject 和PyObject源码分析 一 测试环境介绍和准备 测试环境: 操作系统:windows10 Python版本:3.7.0 下载地址 VS版本:vs2 ...

  8. python3 批量定义多个变量_Python3 基本数据类型详解

    文章来源:加米谷大数据 Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型&quo ...

  9. JAVA的枚举定义和使用

    1.什么是枚举用enum修饰是一种特殊的类,但枚举是类,使用枚举可以很方便的定义常量 枚举的概念:枚举类是一种特殊形式的Java类,枚举类的对象个数是有限且明确的 为什么需要枚举: 因为一些方法在运行 ...

最新文章

  1. 【经验分享】TinyMind 多标签图像分类竞赛小试牛刀——by:for the dream
  2. EPSON机器人SPLE+语言_简单实例
  3. python函数使用易错点_大部分人都会忽略的Python易错点总结
  4. 你需要掌握的三种编程语言
  5. WSAStartup()函数以及DLL的加载
  6. 微软Azure storage account的path值代表什么含义
  7. 【转】Office365完整离线安装包下载及自定义安装教程
  8. python半圆_如何使用Python中的Zelle图形生成一个半圆?
  9. 看了50+竞品分析,我总结出5个常见问题和1套方法论
  10. Java 网络编程(超级详细)
  11. 一步一步安装服务器监视软件MRTG
  12. python plot 坐标轴范围_Python,Matplotlib,子图:如何设置轴范围?
  13. python 获取qq群成员信息_Python获取统计自己的qq群成员信息的方法
  14. oracle怎么锁表以及解锁,Oracle锁表与解锁
  15. 【免费赠送】百度统计热力图邀请码十枚
  16. 虎牙直播怎么换html5,虎牙直播助手怎么改名字 昵称更换方法
  17. cad刷新快捷键_CAD快捷键大全清单,送给每一位CAD初学者,非常实用的干货
  18. Golang工具集-String工具,时间工具,http工具等
  19. 安装kalibr踩坑5:E: Package ‘python-software-properties‘ has no installation candidate
  20. 分页存储逻辑地址转物理地址

热门文章

  1. 【AI白身境】只会用Python?g++,CMake和Makefile了解一下​​​​​​​
  2. 【技术综述】一文道尽R-CNN系列目标检测
  3. 全球及中国汽车空调冷凝器行业发展前景规模及投资战略决策报告2022-2027年
  4. 使用Python操作注册表
  5. android中AVD的使用
  6. 使用mybatis-generator自动生成model、dao、mapping文件
  7. java---switch
  8. Openjudge-NOI题库-和为给定数
  9. Netty系列之一开始使用
  10. jQuery学习笔记1--表格展开关系