首页 > 编程语言 >Python枚举类型enum

Python枚举类型enum

时间:2023-05-17 13:34:12浏览次数:40  
标签:__ Python MAX 成员 enum 枚举 Config


为什么需要枚举

枚举(Enum)是一种数据类型,也是一种特别的类,是绑定到唯一值的符号表示,可以使用它来创建用于变量和属性的常量集枚举类可以看成是一个下拉菜单,给出特定的选项且这些选项不可修改,更贴近自然语言的方式表达数据,可以让代码更容易阅读、维护,减少转换或者错误值引起的问题,enum定义了四个类 Enum、IntEnum、Flag 和 IntFlag和一个装饰器unique()、辅助类auto

  • enum.Enum:创建枚举常量基类,即便定义int,成员也不是整型的,整型相关可以用Int相关类
  • enum.IntEnum:用于创建同时也是 int的子类的枚举型常数的基类
  • enum.IntFlag:创建可与位运算符搭配使用,成员是int的子类
  • enum.Flag:创建可与位运算符搭配使用,又不会失去 Flag成员资格的枚举常量的基类
  • 装饰器unique:确保一个名称只绑定一个值的 Enum 类装饰器
  • 辅助类auto:以合适的值代替 Enum 成员的实例。 初始值默认从 1 开始

如何使用枚举类型
通过继承enum.Enum定义一个枚举类型
import enum
# 继承Enum创建枚举类型
class Config(enum.Enum):
    # 定义枚举成员常量
    MAX = 1000
    MIN = 10


if __name__ == '__main__':
  	# 获取枚举成员、值、属性
    print(Config.MAX)  # Config.MAX
    print(Config['MAX']) # Config.MAX
    print(repr(Config.MAX))  # <Config.MAX: 1000>
    print(type(Config.MAX))  # <enum 'Config'>
    print(Config.MAX.name)  # MAX
    print(Config.MAX.value)  # 1000
    print(Config(1000)) # Config.MAX



# 通过API定义
Config = enum.Enum('Config',{MAX:1000})
'''
第一个参数是枚举的名称
第二个参数是枚举成员的来源,可以是字符串、元组、字典
'''

我们自定义的枚举类型继承Enum基类,之后还是通过Config.MAX获取得到的是枚举成员,通过.name和.value可以获得枚举成员对应的属性

在枚举类型中定义重复的枚举成员会抛出TypeError: Attempted to reuse key异常

在类的外部通过Config.MAX = 2的方式修改,会抛出AttributeError: Cannot reassign members异常


为枚举成员添加额外属性

我们通过.name和.value访问枚举成员的定义名称和值,也可以为枚举成员添加其他属性

获取枚举成员,可以通过key获取,也可以通过value获取枚举成员

if __name__ == '__main__':
    Config.MAX.msg = '最大值'
    Config.MIN.msg = '最小值'
		# 示例一
    print(Config.MAX.msg)  # 最大值
    print(Config.MIN.msg)  # 最小值
    
    # 示例二
    conf = Config.MAX
    print(conf.msg)  # 最大值
    
		# 示例三
    conf = Config(10)
    print(conf.msg)  # 最小值

枚举成员迭代

枚举支持按照定义顺序进行迭代

class Config(enum.Enum):
    MAX = 1000
    MIN = 10


if __name__ == '__main__':
    for number in Config:
        print(number) 
        '''
        Config.MAX
				Config.MIN
        '''

特殊属性 __members__ 可以迭代从名称到成员的有序映射,包含所有美剧中定义的所有名称,包括别名

# 1.不会给出别名
print(list(Config))  # [<Config.MAX: 1000>, <Config.MIN: 10>]

# 2.可以显示别名
for name,number in Config.__members__.items():
		print(name,number)
unique装饰器

定义枚举时,成员名称不允许重复,但是默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名,如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员,如果我们想确保一个枚举类中的成员的值也不会重复,可以使用unique装饰器

@enum.unique
class Config(enum.Enum):
    MAX = 1000
    MIN = 10
    
'''
使用该装饰器后,如果有相同的值,会抛出ValueError: duplicate values found
'''
auto()

如果确切的值不重要,可以使用auto()生成值,值将由 _generate_next_value_() 来选择

_generate_next_value_默认是我们定义的最后一个int开始+1,如下示例,TIME的auto值则是11

_generate_next_value_可以重写,必须定义其他成员之前

class Config(enum.Enum):
    MAX = 1000
    MIN = 10
    TIME = enum.auto() # 11
    City = enum.auto() # 12
    

'''
自定义_generate_next_value_
'''
class Config(enum.Enum):
    def _generate_next_value_(name, start, count, last_values):
        return name  # 返回枚举成员的名字

    MAX = 1000
    MIN = 10
    TIME = enum.auto()  # TIME 
    City = enum.auto() # City
比较运算
# 枚举成员按标识号进行比较

Config.MAX is Config.MAX # True
Config.MAX is Config.MIN # False
Config.MAX == Config.MAX #True

#与非枚举值结果总数不相等
Config.MAX == 1000 # False

枚举类型使用事项
  • 枚举类不可实例化
  • 枚举成员是可哈希的,可以在字典和集合中使用

标签:__,Python,MAX,成员,enum,枚举,Config
From: https://www.cnblogs.com/Mickey-7/p/17408480.html

相关文章

  • 48024 python 代码分析
    ComputerScience220SC(2023)Assignment3(Basicgraphalgorithmsandtraversals)SeeCanvasforduedateThisassignmentrequiresyoutosubmitprogramsinPythonthatyouhavewrittenyourselftotheautomarker,https://www.automarker.cs.auckland.ac.nz.Yo......
  • 【Python】Centos7安装dirsearch
    一、升级Openssl1.1.1 1、官网下载源码:https://www.openssl.org/2、安装#./config--prefix=/datas/soft/openssl-1.1.1no-zlib#make#makeinstall3、新版配置#ln-s/datas/soft/openssl-1.1.1/include/openssl/usr/include/openssl#ln-s/datas/soft/openss......
  • < Python全景系列-3 > Python控制流程盘点及高级用法、神秘技巧大揭秘!
    欢迎来到我们的系列博客《Python全景系列》!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法。无论你是编程新手,还是有一定基础的开发者,这个系列都将提供你需要的知识和技能。 这是系列第三篇,在这篇文章中我们将全面深......
  • python 使用企业微信发邮件加加图形化界面
    importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QLabel,QLineEdit,QTextEdit,QPushButtonimportrequests,base64,hashlibimportsmtplibimportosimportglobfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipa......
  • generate a 3D chart in Python using the CSV data
    Here's an example of how you could use Matplotlib to create a 3D scatter plot from your CSV data:   importpandasaspdimportmatplotlib.pyplotaspltfrommpl_toolkits.mplot3dimportAxes3D#LoadtheCSVdataintoaPand......
  • 用Python开发输入法后台
    首先,安装PIME,github地址:https://github.com/EasyIME/PIME下载安装PIME-1.3.0-stable-setup.exe,就可以得到一个输入法,后端是python,在安装目录下‘C:\ProgramFiles(x86)\PIME\’,python目录就是运行脚本。入口点是'server.py',其中安装目录下的‘PIMELauncher.exe’是负责前后台......
  • python 项目报错 Fatal Python error: _enter_buffered_busy: could not acquire lock
    FatalPythonerror:_enter_buffered_busy:couldnotacquirelockfor<_io.BufferedWritername=''>atinterpretershutdown,possiblyduetodaemonthreadsPythonruntimestate:finalizing(tstate=0x00005654c4008a40)Currentthread0x00007fc......
  • Python学习
    3-13字符串类型字符串类型:str   1.定义格式:       变量='内容'           打印一行       变量="内容"           打印一行       变量='''内容'''或者三引号           可以通过回车的方式换行,且打印出......
  • python环境搭建,使用conda工具
    开发环境搭建安装miniConda:conda和miniConda和Anaconda的区别安装pycharm:pycharm创建项目并使用base环境作为开发环境pycharm的interpreter是什么安装jupyter:jupyter的快捷键conda的虚拟环境命令:condacreatecondaact......
  • 基于”python+requests模块“接口自动化的基本方法使用
    1,接口自动化测试1.1概念接口测试:是对系统或者组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。接口自动化测试:让程序代替人为对接口项目进行自动验证测试的过程1.2实现方式1,工具(jmeter,postman)2,代码(python-requests)1.3测试工具缺点......