介绍

enum是一个用来枚举的模块

创建枚举类型

import enum

# 创建一个类,继承自enum下的Enum
class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = 6 # 下面便可以通过名称直接获取成员
print(Color["red"], type(Color["red"])) # Color.red <enum 'Color'>
print(Color.red, type(Color.red)) # Color.red <enum 'Color'>
# 打印的是<enum 'Color'>类型 # 那么如何获取里面的值呢?
# 调用name获取名称,调用value获取值
print(Color.red.name, type(Color.red.name)) # red <class 'str'>
print(Color.red.value) # 1 # 也可以通过迭代来获取值
for c in Color:
print(c.name, c.value)
"""
red 1
green 2
blue 3
yellow 4
pink 5
cyan 6
"""

名称或者值相同

import enum

# 如果我定义了重复的key(仮)
try:
class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = 6 cyan = 5 except Exception as e:
print(e) # Attempted to reuse key: 'cyan' # 提示我们key重复了
import enum

# 如果我定义了重复的value(仮)
class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = 6 purple = 6 # 这是通过value来获取成员
# 获取成员可以通过Color.key | Color[key]的方式,还可以使用Color(value)的方式
print(Color(6).name) # cyan
print(Color.purple.name) # cyan
# 可以看到只打印了cyan
# 如果值相同的话,那么后者相当于前者的别名,两者指向的内容是一样的 for c in Color:
print(c)
"""
Color.red
Color.green
Color.blue
Color.yellow
Color.pink
Color.cyan
"""
# purple依旧没有打印 # 那如果我就想把值相同的也打印出来,要怎么做呢?
# 枚举内部有一个__members__属性,相当于一个字典
for c in Color.__members__.items():
print(c[0], c[1])
"""
red Color.red
green Color.green
blue Color.blue
yellow Color.yellow
pink Color.pink
cyan Color.cyan
purple Color.cyan
"""
# 第一个元素是key,str类型。第二个元素是枚举类型。
# 可以看到最后一个,即便key是purple,但是对应的枚举类型依旧是Color.cyan
for c in Color.__members__.items():
print(c[0], c[1], c[1].name, c[1].value)
"""
red Color.red red 1
green Color.green green 2
blue Color.blue blue 3
yellow Color.yellow yellow 4
pink Color.pink pink 5
cyan Color.cyan cyan 6
purple Color.cyan cyan 6
"""
# 最后一个打印的仍是cyan # 成员之前也可以进行比较,但只支持is和==操作符,不支持大小比较
print(Color.green is Color.red) # False
print(Color.green is Color.green) # True
print(Color.cyan is Color.purple) # True
print(Color.cyan == Color.purple) # True

成员的值是否可变

import enum

class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = 6 purple = 6 try:
Color.red.name = "xxx"
except Exception as e:
print(e) # can't set attribute try:
Color.red.value = "xxx"
except Exception as e:
print(e) # can't set attribute # 可以看到是无法赋值的
import enum

class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = [] purple = [] print(Color.cyan is Color.purple) # True
Color.cyan.value.append(123)
print(Color.cyan is Color.purple) # True
"""
可以看到,尽管无法重新赋值,但是本地修改还是可以的,如果是可变类型的话
但是两个还是一样的,因为purple是cyan的别名,当在创建这个类的时候,由于都是空列表,所以认为两者是一样
因此当我对cyan.value进行append的时候,会影响purple
""" print(Color.cyan.value) # [123]
print(Color.purple.value) # [123] Color.purple.value.append(456) # 通过反过来也是一样的
print(Color.cyan.value) # [123, 456]
print(Color.purple.value) # [123, 456]

强制让成员的值不一样

枚举类,key重复是不允许的,但是值重复是可以的,可如果我也不允许值重复呢?只需要加上一个装饰器即可

import enum

try:
@enum.unique
class Color(enum.Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = [] purple = [] except Exception as e:
print(e) # duplicate values found in <enum 'Color'>: purple -> cyan # 提示我们purple和cyan的value重复了

比较成员的值

之前说过,枚举成员是不支持大小比较的,但如果我想支持呢?

import enum

# 换一种继承的类,改成IntEnum
class Color(enum.IntEnum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = "6" # 此时里面的成员要是int类型,或者能将字符串转成int print(Color.red < Color.blue) # True
print(Color.red + Color.cyan) # 7

enum:python实现枚举也很优雅的更多相关文章

  1. Python 的枚举 Enum

    枚举是常用的功能,看看Python的枚举. from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May' ...

  2. 别再说Python没有枚举类型了,好好看看

    枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. Python 的原生类型(Built-in types)里并没有专门的枚举类型,但是我们可以通 ...

  3. python基础——枚举类

    python基础——枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单 ...

  4. python代码如何写的优雅?

    简介 在实际项目中,我们可能一开始为了完成功能而忽视了代码的整体质量,因此,使用一些高阶的函数或方法,能够更加使我们的代码更加优雅.废话不多说,现在马上开始. 使用enumerate方法替代range ...

  5. 使用Enum.TryParse()实现枚举的安全转换

    在项目中,有时候会用到领域枚举和DTO枚举的映射和转换.有一个现实的问题是:如果领域枚举项发生变化,而DTO枚举项没有及时更新,这样会造成映射不上的问题.那么,如何避免此类问题呢? 先看领域枚举和DT ...

  6. Java分享笔记:自定义枚举类 & 使用enum关键字定义枚举类

    在JDK1.5之前没有enum关键字,如果想使用枚举类,程序员需要根据Java语言的规则自行设计.从JDK1.5开始,Java语言添加了enum关键字,可以通过该关键字方便地定义枚举类.这种枚举类有自 ...

  7. python:枚举类型

    1.什么是枚举类型? 枚举类型可以看做是一系列常量的集合,通常用于表示某些有限且固定的集合,例如月份(一年有12个月).星期(一星期有七天).季节(一年四个季节)等. 2.枚举的定义 定义枚举首先要导 ...

  8. Python面向对象-枚举类型enum

    枚举类型:在实际问题中,有些变量的值被限定在一个有限的范围内.例如:一个星期有且只有7天,一年有且只有十二个月,一个班每周有6门课程等等.如果把这些量说明为整型.字符串或者其他类型显然是不合适.编程界 ...

  9. Python 的枚举类型

    起步 Python 中的枚举类型 Python 的原生类型中并不包含枚举类型.为了提供更好的解决方案,Python 通过 PEP 435 在 3.4 版本中添加了 enum 标准库. 枚举类型可以看作 ...

随机推荐

  1. vue.js 三种方式安装

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  2. qt liunx 安装命令

    qt SDK : apt-get install qt-sdkqt 安装 : apt-get install qtcreator文档安装 : cmake kdelibs5-data subversio ...

  3. 关于bootstrap按钮的偏移

    <body> <div id="divForm" class="addView"> <div class="form-h ...

  4. visual studio 2019不能在vue文件中直接识别less语法

    试了好多方法,不象vs code那样能直接在template vue文件中就识别less语法下边这种分离的方式是可以的,在项目中也比较实用,将来你代码量大了,样式/脚本也还是要和template代码分 ...

  5. UnitTest之Xunit

    Unit Test 1.建立单元测试 新建一个类库项目,在Nuget中搜索xunit,选择 xUnit.net 和 xunit.runner.visualstudio 插件包安装. xunit.run ...

  6. C# Job System概述

    C# 作业系统是如何工作 允许用户编写与Unity其余部分良好交互的多线程代码,并使编写正确的代码变得更加容易. 编写多线程代码可以提供高性能的好处,其中包括帧速率的显著提高.以及将Burst编译器与 ...

  7. 一篇文章搞懂python2、3编码

    说在前边: 编码问题一直困扰着每一个程序员的编程之路,如果不将它彻底搞清楚,那么你的的这条路一定会走的格外艰辛,尤其是针对使用python的程序员来说,这一问题更加显著, 因为python有两个版本, ...

  8. flask类装饰器

    from flask import Flask,request,views from functools import wraps app = Flask(__name__) #自定义登录装饰器 de ...

  9. Elasticsearch-字符串类型

    ES-用于定义文档字段的核心类型 ES中一个字段可以是核心类型之一,如字符串.数值.日期.布尔型,也可以是一个从核心类型派生的复杂类型,如数组. 字符串类型 索引一类型为字符串的数据doc1: Fen ...

  10. asp.net之后台使用根目录运算符

    在asp.net前台,大家会经常使用根目录运算符~.这样,可以不用考虑网站的配置目录. 有时,需要在后台设置路径,同样需要使用根目录运算符.好吧,其实我每次需要使用这种方法,就需要在baidu上查找如 ...