介绍

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

print(Color.red, type(Color.red)) # Color.red

# 打印的是类型

# 那么如何获取里面的值呢?

# 调用name获取名称,调用value获取值

print(Color.red.name, type(Color.red.name)) # red

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 : 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_enum:python实现枚举也很优雅相关推荐

  1. python一看就很厉害的代码_Python学习教程:怎么写出让人看起来就很舒服的代码?...

    Python学习教程:怎么写出让人看起来很优雅舒服的代码?让人眼前一亮! 很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之 ...

  2. python读取枚举_在python中枚举(enumerate in python)

    在python中枚举(enumerate in python) 说, term='asdf'; InvertedIndex = {}; InvertedIndex[term] = [1,2,2,2,4 ...

  3. Python相关介绍(很好)

    Python啊Python,一直都还是只闻其名,还未见其声啊,希望有时间得抓紧见面啊. 下面是转载的文章(找不到原链接了,见到转载请告知): Python(KK 英语发音:/ˈpaɪθən/), 是一 ...

  4. 有没有可以翻译c语言程序的软件下载,程序员秒懂!分享一款很优雅的翻译软件...

    原标题:程序员秒懂!分享一款很优雅的翻译软件 软件名称:QTranser 取名QTranser,代表快速翻译的意思,实际上真的是最快(方便)的翻译软件~~ 简介: 我为什么要写这款软件 其实还是有不少 ...

  5. python enumeration_python枚举防止无效的属性分配

    要使枚举类完全"只读",只需要使用 __setattr__ hook 防止 全部的 属性分配.因为元类附加到类 之后 它是创建的,分配正确的枚举值没有问题. 就像伊桑的回答一样,我 ...

  6. python的设计哲学是优雅明确简单_Python简单教程

    python教程 1991年发布第一个版本 设计定位:Python的设计哲学是"优雅"."明确"."简单". Python开发者的哲学是&q ...

  7. 第3章 枚举!很暴力

    第3章 枚举!很暴力 第1节 坑爹的奥数 口3 * 6528 = 3口*8256,在两个口内填入相同的数字使其成立: package ch3;public class Meiju1 {public s ...

  8. 《啊哈算法》的Java现实 | 第三章:枚举!很暴力

    <啊哈算法>的Java现实 | 第一章:排序. <啊哈算法>的Java现实 | 第二章:栈.队列.链表. <啊哈算法>的Java现实 | 第三章:枚举!很暴力. & ...

  9. Python 模块大全(很详细!)

    转载:.... Python的模块大全,很全,有详细介绍! 另外附Python两个教程 1. Python详细教程(廖雪峰的官方网站,语言简洁!) 2. Python 进阶教程 (Vamei) 3. ...

最新文章

  1. MySQL主从复制Windows实现
  2. C语言十六进制数转八进制(十进制作为中介)(附完整源码)
  3. 支付宝的商业与技术创新双轮驱动 创造数字时代普惠金融“奇迹”
  4. 实验5 类的继承、派生和多态(2)
  5. bmp280c语言程序,51单片机读取BMP280 180 280气压值1602显示程序
  6. JAVA中的按值传递
  7. 事件类型-UI事件、焦点事件
  8. 个人网页制作 大学生个人网页设计 个人网站模板 简单静态HTML个人网页作品 HTML+CSS+JavaScript
  9. 看阮一峰ES6 笔记
  10. 调侃大学生[太有才了]
  11. 计算机教室消防说明,6.7 消防专用电话的设置
  12. 学而思pythonlevel3_【学而思网校语言学习】学而思网校【2019-寒】AE英语直播班 Level 3上【报价 价格 评测 怎么样】 -什么值得买...
  13. Emacs快捷键 转自:http://www.engr.uvic.ca/~dastone/emacs-keys.html
  14. oracle group by 10minite
  15. a8处理器相当于骁龙几_ 联发科发布新款中端处理器,能否与高通骁龙765G一战?...
  16. VMware Workstation虚拟机备份及磁盘空间回收
  17. 注册github一直显示验证码错误的问题
  18. 惊!用Java实现生产者消费者问题能这么简单?
  19. win10防火墙_Win10端,iCloud报错:鉴定过程中发生错误
  20. 用java代码怎样打开网址_写了一段打开网页java代码报错: 求大神解救

热门文章

  1. linux6.6挂载u盘失败,mini2440 Linux系统自动挂载U盘与SD卡失败 解决方法
  2. linux中的c 环境变量,Linux C 参考手册 之 环境变量篇
  3. channelread0会被调用两次_值得一看:C#同步方法中如何调用异步方法?
  4. 阿里技术专家推荐的20本书,免费送!
  5. Lombok 介绍和使用详情
  6. 蓝桥杯java第六届决赛第三题--显示二叉树
  7. struts2中action向action之间传数据和action向jsp传数据理解
  8. struts2中result的type跳转类型总结
  9. 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
  10. python操作手机app_【Python】[技术博客] 一些使用Python编写获取手机App日志的操作...