【python】枚举的基本使用,及如何实现枚举属性的自增长

news2024/11/24 17:44:19

▒ 目录 ▒

    • 🛫 问题
      • 描述
      • 环境
    • 1️⃣ 枚举的基本使用
      • 自定义枚举成员的值
      • 枚举值唯一:@unique
      • 枚举成员的别名:@property
      • 枚举成员的元数据
    • 2️⃣ 实现枚举属性的自增长
      • python3.6+
      • python3.5.2
      • python2不支持enum模块
    • 🛬 结论
    • 📖 参考资料

🛫 问题

描述

学过c的都知道,c中有enum,可以定义一组特定值的常量。
python也拥有类似的能力,不过,它不是语法层次的,而是以类库的形式提供给开发者。
今天我们就来说说python中的枚举,并通过它实现枚举属性的自增长

环境

版本号描述
文章日期2023-06-29
操作系统Win11 - 21H2 - 22000.1335
Python3.7.1
Python3.5.2

1️⃣ 枚举的基本使用

自定义枚举成员的值

在Python中,使用enum模块来创建枚举类型。枚举类型定义了一组具有命名值的常量。
可以使用枚举类型来避免硬编码常量,并提高代码的可读性和可维护性。

以下是使用enum模块创建枚举类型的示例:

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

print(Color.RED)    # Color.RED
print(Color.RED.name)   # RED
print(Color.RED.value)  # 1

在上面的示例中,定义了一个名为Color的枚举类型,它有三个常量:REDGREENBLUE。每个常量都有一个名称和一个。可以使用常量的名称和值来访问它们。

枚举类型的名称必须是唯一的,但值可以重复。可以使用枚举类型的name属性获取常量的名称,使用value属性获取常量的值。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 5
    NEXT = 5
    END = BLUE


print(Color.RED)    # Color.RED
print(Color.RED.name)   # RED
print(Color.NEXT.value)  # 5
print(Color.END.value)  # 5

枚举值唯一:@unique

可以使用@unique装饰器来防止枚举成员具有相同的值。

from enum import Enum, unique

@unique
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

    @property
    def name(self):
        return self.name.lower()

    @classmethod
    def from_name(cls, name):
        return cls[name.upper()]
 

当定义相同的值NEXT = 5时,会报错。
在这里插入图片描述

枚举成员的别名:@property

可以通过自定义属性,将枚举成员的名称转换为大写或小写。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

    @property
    def nameX(self):
        return self.name.lower()


print(Color.RED)    # Color.RED
print(Color.RED.name)    # RED
print(Color.RED.nameX)    # red

枚举成员的元数据

from enum import Enum

class Color(Enum):
    RED = ('Red Color', True)
    GREEN = ('Green Color', False)
    BLUE = ('Blue Color', True)

    def __init__(self, description, flag):
        self._description_ = description
        self._flag_ = flag

    @property
    def description(self):
        return self._description_

    @property
    def flag(self):
        return self._flag_

print(Color.GREEN.name)						# GREEN
print(Color.GREEN.value)					# ('Green Color', False)
print(Color.GREEN.description)				# Green Color
print(Color.GREEN.flag)						# False
 

2️⃣ 实现枚举属性的自增长

开发中,经常定义庞大的枚举类型,这时候我们一个个去调整枚举的数值,会非常的麻烦,接下来就通过特殊手段实现枚举类型的值自增长。

python3.6+

python3.7中,我们可以通过auto这个class,自动的实现Ordinal的类属性自动增加,从而完成想要的功能。

from enum import IntEnum, Enum, auto

class Color(IntEnum):
    NORTH = 3
    SOUTH = auto()
    EAST = auto()
    WEST = auto()

print(Color.NORTH.value)  # 3
print(Color.SOUTH.value)  # 4
print(Color.EAST.value)   # 5
print(Color.WEST.value)   # 6

python3.5.2

将python环境从3.7切换到3.5.2,我们会发现下面报错内容:
在这里插入图片描述

从图中可以看出,python3.5.2中并没有实现auto类,难道python3.5.2不能实现自增长吗?只能使用最原始的,给每个值手动赋值的方式吗?
为了一探究竟,小编翻了翻python文档,文档中给了两种方案:

方案一: 使用Enum类的构造函数

文档中的用法如下:
image.png

示例代码:

from enum import Enum

Animal = Enum('Animal', 'ant bee cat dog', start=4)
print(Animal.ant)            # Animal.ant
print(Animal.cat.value)      # 6

方案二: 使用Enum类的构造函数
下面是python文档给的例子,实现自增长的枚举,这也可能就是后期python版本中的实现了。

class AutoNumber(Enum):
    def __new__(cls):
        value = len(cls.__members__) + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj

class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()

print(Color.green.value) # 2

不过这个代码功能实在有限,red = ()不能改为red = 3,也就是说,不能指定初始值。
所以在python3.5中,直接使用方案一,就可以了。

python2不支持enum模块

这个没啥说的,就是不支持这个库,直接报错。
在这里插入图片描述

没有python2的用户,可以直接通过在线工具尝试该功能:https://c.runoob.com/compile/6/。
在这里插入图片描述

🛬 结论

查了些资料,说auto()这种用法是python3.6的新特性,闹心了,看来不使用新版本的python,很多功能就无法使用。对于无法更新版本的公司(线上稳定版本是旧的python版本,最新版本python无法稳定运行的情况),只能自己想办法实现类似的功能了。

📖 参考资料

  • 在线编译环境 https://c.runoob.com/compile/9/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧医疗救护车数据采集、远程管理物联网方案-5G工业路由器应用

随着5G通信技术发展成熟,逐渐普遍应用于物联网中,救护车是医疗中不可缺少的部分,在救护车的物联网中具备车辆定位、数据采集、在线传输、远程监控等功能,5G工业路由器需要对救护车提供全程联网,实现智慧医疗的信息化、…

【JUC进阶】08. 重量级锁

目录 1、前言 2、重量级锁 3、数据结构和控制流程 3.1、Monitor 对象 3.2、控制流程 4、性能分析 5、同其他锁的对比 1、前言 前面我们介绍了偏向锁,轻量级锁,自旋锁相关知识。初次之外,锁升级过程还会涉及到重量级锁。重量级锁是并发…

基于Java珠宝首饰交易平台设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

新品预告——旗舰级DG4Pros最详技术解析及应用方案介绍

旗舰级DG4Pros RIY-DG4Pros是目前睿铂性能指标最高的一款全画幅倾斜摄影相机,其核心光学组件部分由睿铂结合多年来的用户反馈与对倾斜摄影技术的探索成果,完全自主研发设计,技术水平领先于市面同类产品。相机镜头内置双高斯结构和超低色散非…

Spring Boot 中的 Type-safe Configuration Properties:原理、用法与示例

Spring Boot 中的 Type-safe Configuration Properties:原理、用法与示例 前言 Spring Boot 是一个快速开发 Spring 应用程序的框架,它提供了很多有用的功能和特性。其中,Type-safe Configuration Properties 是一个常用的功能,…

基于STL的演讲比赛流程管理

比赛规则: 学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。每名选手都有对应的编号,如10001~10012 比赛方式:分组比赛,每组6个人; 第一轮分为两个小组,整体按…

python: more Layer Architecture and its Implementation in Python and mysql 8.0

mysql 8.0 drop table DuStudentList;#学生表create table DuStudentList (StudentId INT NOT NULL AUTO_INCREMENT comment主键id, #自动增加,StudentName nvarchar(50) comment学生姓名,StudentNO varchar(50) comment学号, #学号StudentBirthday datet…

单片机学习12-串口通信

目录 串口通信实验 通信的基本概念 串行通信与并行通信 异步通信与同步通信 单工、半双工与全双工通信 通信速率(比特率) 单片机串口介绍 串口通信简介 串口相关寄存器 串口工作方式 方式 0 方式 1 方式 2 和方式 3 串口的使用方法 硬件设计…

基于matlab使用形态操作对视频流中的对象进行计数(附源码)

一、前言 此示例演示如何使用形态操作对视频流中的对象进行计数 输入视频流包含订书钉的图像。在此示例中,您使用平顶形态操作来消除不均匀的照明,并使用打开形态操作来消除订书钉之间的间隙。然后,将图像转换为二进制,对每个帧…

【Java】网络通信基础、协议分层及封装分用

IP地址:端口号概念格式 协议五元组协议分层TCP/IP五层模型 封装和分用 网络互连的目的是进行网络通信,也就是网络数据传输,更具体一点,是网络主机中的不同进程间基于网络来传输数据。 IP地址:端口号 概念 ip地址表示…

数据库监控与调优【十七】—— 表结构设计优化

表结构设计优化 第一范式(1NF) 字段具有原子性,即数据库的每一个字段都是不可分割的原子数据项,不能是集合、数组、记录等非原子数据项 当实体中的某个属性有多个值时,必须拆分为不同的属性 例子: 如图…

23.6.23

1.整理用户相关的指令、整理磁盘相关的指令 (1)用户相关 创建用户:sudo adduser 用户名 给新用户添加sudo权限:sudo vim /etc/sudoers 添加后wq!强制退出 删除用户:sudo userdel (-r&#x…

tomcat环境部署

目录 一、安装jdk 1、关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下,安装JDK 2、设置JDK环境变量 3、使用文本工具编写java源代码 二、安装启动Tomcat 1、解包 2、后台启动 3、使用80端口访问 一、安装jdk 在部署 Tomcat 之前必须安装好…

Java学习629

线程安全 开发中银行排号,火车售票系统中多线程程序发生的问题 引入代码: package Test0626;class SaleTicket implements Runnable{int ticket 100;Overridepublic void run() {while(true){if (ticket > 0){System.out.println(Thread.currentT…

ROS2 launch文件同时引入yaml文件参数和自定义变量参数

0 背景 在ROS中,launch工具可以帮助用户同时启动多个节点,以及引入多种设置如参数导入、节点名重映射等。在ROS1中,launch文件通过xml语言编写,后缀名为.launch;而ROS2在xml的基础上(后缀名为.xml&#xf…

【Servlet学习四】实现一个内存版本的表白墙~

目录 一、前端代码 二、后端代码实现 🌈1、全局类定义AppVar 🌈2、实体类定义Message 🌈3、获取所有信息:getMessageServlet实现前后端的交互 🌈4、添加数据:addMessageServlet,实现前后端…

notepad++去除换行符和空格

在notepad中按Ctrlh 1.去除换行符 输入如图所示的查找内容为\r\n,【替换为】不填写,勾选底部的【正则表达式】,然后点击【全部替换】 2. 按照逗号换行 输入如图所示的查找内容为,,【替换为】\r\n,勾选底部的【正则…

C# WinForm 选择打开文件和保存文件

做 winform 项目的时候正好遇到了记录一下: 打开文件 我们使用 OpenFileDialog 控件来打开文件选择框: 通过 Title 属性可以设置选择框的标题而 Filter 属性可以设置选中的文件类型,这个属性由两个部分组成 SVG files (*.svg)|*.svg &am…

九、云尚办公系统-管理端-审批管理

云尚办公系统:管理端-审批管理 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布,并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步!!…

Unity导出到AS中真机测试apk没有问题,aab提交到GooglePlay审核通过,但是从Google Play下载的应用闪退问题

从Google Play下载的应用报错如下: backtrace: #00 pc 0x0000000000050748 /data/app/~~x94h_Fmdoj4Vj1NVQcL7sQ/com.id.hhhuhi-LpC7BJqILn3X29R8TffhuA/split_config.arm64_v8a.apk!libpairipcore.so (ExecuteProgram196) 06-26 20:39:40.526 13936 13936 F l…