ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python 基础(十五):枚举

2021-06-28 14:52:09  阅读:235  来源: 互联网

标签:WeekDay Python 成员 枚举 Mon print day 十五


1 简介

起初 Python 中并未内置枚举(enum)类型,枚举是在 Python3.4 添加的新功能,此时我们可能会有一个疑问:Python3.4 之前的版本还能不能使用枚举呢?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

答案是可以使用,但是不能直接使用,使用之前需要先用 pip install enum 安装。

什么是枚举?

枚举可看作是一系列符号名称的集合,集合中每一个元素要保证唯一性和不可变,因此我们可以对枚举中元素进行恒等比较,通俗来讲枚举就是一系列常量的集合,枚举是可迭代的。

枚举有什么作用?

我们先来思考一个问题:不使用枚举我们如何定义常量呢?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

常用的做法是采用变量名大写的方式来定义,这种方式虽然简单,但问题在于我们定义的仍然是变量、是可以被修改的,而常量是什么呢?简单来说就是不可变的量,枚举就有不可变的特性,所以枚举的主要作用就是用来定义常量的。

2 使用

2.1 创建

枚举语法与 class 语法相同,之前我们在Python 基础(十一):面向对象中已经介绍过 class 了,枚举的定义可以通过继承 Enum 的方式来实现, 看一下示例:

  •  
from enum import Enum
class WeekDay(Enum): Mon = 0 Tue = 1 Wed = 2 Thu = 3 Fri = 4

2.2 访问

枚举成员及属性的访问如下所示:

  •  
# 枚举成员print(WeekDay.Mon)# 枚举成员名称print(WeekDay.Mon.name)# 枚举成员值print(WeekDay.Mon.value)

枚举的迭代也很简单,如下所示:

  •  
# 方式 1for day in WeekDay:    # 枚举成员    print(day)    # 枚举成员名称    print(day.name)    # 枚举成员值    print(day.value)
# 方式 2print(list(WeekDay))

2.3 比较

枚举成员及属性可以使用 is 进行对象比较,还可以使用 == 进行值比较,看下示例:

  •  
print(WeekDay.Mon is WeekDay.Thu)print(WeekDay.Mon == WeekDay.Mon)print(WeekDay.Mon.name == WeekDay.Mon.name)print(WeekDay.Mon.value == WeekDay.Mon.value)

枚举成员不能进行大小比较,如下所示:

  •  
>>> WeekDay.Mon < WeekDay.ThuTypeError: '<' not supported between instances of 'WeekDay' and 'WeekDay'

2.4 确保枚举值唯一

我们定义枚举时,成员名称是不可以重复的,但成员值是可以重复的,如果想要保证成员值不可重复,可以通过装饰器 @unique 来实现,如下所示:

  •  
 from enum import Enum, unique
@uniqueclass WeekDay(Enum): Mon = 0 ...

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

标签:WeekDay,Python,成员,枚举,Mon,print,day,十五
来源: https://blog.51cto.com/u_15283574/2951215

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有