首页 > 编程语言 >python学习:枚举定义和使用

python学习:枚举定义和使用

时间:2022-10-12 16:22:21浏览次数:58  
标签:Orientation python value name --- 枚举 FEMALE 定义

1.定义

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

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

2.使用

使用 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)
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
''' 
 
 
 
#输出如下:
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('南'),这是完全允许的。

3.枚举构造器

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

例如如下程序: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)<br><br>

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

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

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

简单来说,枚举的构造器需要几个参数,此处就必须指定几个值。

输出如下:

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

标签:Orientation,python,value,name,---,枚举,FEMALE,定义
From: https://www.cnblogs.com/xxpythonxx/p/16784895.html

相关文章

  • 【Python】HTML中Base64存储的图片转为本地图片文件
    我用jupyternotebook写了笔记之后,想导出markdown,然后导出不了,我就只能导出html,结果导出的html存储图片用的base64的方式……于是我就要把导出的html文档里面的base64格式......
  • 【Python进阶】实战Python图形文件操作基本编程
    欢迎来到专栏《Python进阶》。在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件、数据的处理,Python各种好用的库如NumPy、Scipy、Matplotlib、Pandas的使用等等......
  • 单链表-Python实现-jupyter->markdown 格式测试
    单链表引入顺序表理解Python变量的本质:变量存储的不是值,是值的地址理解Python的"="表示的是指向关系案例:交换a,b的值,a=10,b=20a,b=20,10t0:a这块内存(也有id),......
  • Python基础 - 序列结构
    对内置的常用数据结构,列表,字典,元组,集合的基本点看书整理.有序序列:列表、元组、字符串无序序列:字典、集合可变序列:列表、字典、集合不可变......
  • Python基础 - 面向对象
    面向对象基础入门,理解概念为主,其妙用需要很长时间去领悟哦.引入Python既是面向过程,也能面向对象.初学来理解为啥要面向对象,不太可能,用处......
  • 【chainer速成】chainer图像分类从模型自定义到测试
    文章首发于微信公众号《有三AI》​​【chainer速成】chainer图像分类从模型自定义到测试​​欢迎来到专栏《2小时玩转开源框架系列》,这是我们第八篇,前面已经说过了caffe,tens......
  • 【MatConvnet速成】MatConvnet图像分类从模型自定义到测试
    欢迎来到专栏《2小时玩转开源框架系列》,这是我们第10篇,前面已经说过了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk,chainer,deeplearning4j。今天说MatConvnet,本文所用......
  • 【AI白身境】学AI必备的python基础
    今天是新专栏《AI白身境》的第三篇,所谓白身,就是什么都不会,还没有进入角色。上一篇给大家介绍了如何正确使用Linux,如何利用shell,vim,git这三大神器。相信大家也掌握的差不多了......
  • 【AI白身境】只会用Python?g++,CMake和Makefile了解一下
    今天是新专栏《AI白身境》的第六篇,所谓白身,就是什么都不会,还没有进入角色。对于大部分小白来说,因为python用的太爽,以致于或许都没有听说过CMake。python是脚本语言,而当前大......
  • 【Python进阶】带你使用Matplotlib进行可视化
    欢迎来到专栏《Python进阶》。在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件、数据的处理,Python各种好用的库如NumPy、Scipy、Matplotlib、Pandas的使用等等......