# enum用于枚举,该模块下有一个Enum,我们定义的类要继承它
# 一旦继承,那么我们定义的key(仮),不能有重复值。
# 如果要保证value(仮)不重复,那就引入unique,给我们定义的类加上这个装饰器

from enum import Enum, unique

@unique
class Color(Enum):
    red = 1
    green = 2
    blue = 3
    yellow = 4
    pink = 5
    cyan = 6

# 通过名称获取成员,两种方式
print(Color["red"])  # Color.red
print(Color.red)  # Color.red

# 通过值来获取成员
print(Color(2))  # Color.green

# 获取成员的名称和值
print(Color.red.name)  # red
print(Color.red.value)  # 1

# 也可以通过迭代获取成员
for color in Color:
    print(color.name, color.value)
'''
red 1
green 2
blue 3
yellow 4
pink 5
cyan 6
'''

  

# 如果不加上unique,也就允许值相同会有什么情况

from enum import Enum

class Girls(Enum):
    satori = 1
    mashiro = 2
    nagisa = 3
    tomoyo = 4
    kurisu = 5
    sola = 1

# satori 和sola的值都是1
print(Girls(1))  # Girls.satori,会发现只打印了satori,也就是第一个。如果值相同,那么后者相当于是前者的别名。

# 遍历的话,会发现sola同样没有被打印出来
for girl in Girls:
    print(girl)
'''
Girls.satori
Girls.satori
Girls.mashiro
Girls.nagisa
Girls.tomoyo
Girls.kurisu
'''

# 如果想获取所有的成员,哪怕值相同,该怎么做呢?
# 枚举属性内部有一个__members__属性,相当于一个字典
for girl in Girls.__members__.items():
    print(girl)
'''
('satori', <Girls.satori: 1>)
('mashiro', <Girls.mashiro: 2>)
('nagisa', <Girls.nagisa: 3>)
('tomoyo', <Girls.tomoyo: 4>)
('kurisu', <Girls.kurisu: 5>)
('sola', <Girls.satori: 1>)
'''
# 会发现以一种更详细的方式打印了出来
# 并且每个元组的第二个元素是<enum 'Girls'>类型
# 不要被<>给忽悠了,其实就是我们用Girls.satori,Girls.mashiro ····获取得到的结果
for girl in Girls.__members__.items():
    print(girl[1].name, girl[1].value)
'''
satori 1
mashiro 2
nagisa 3
tomoyo 4
kurisu 5
satori 1
'''

# 成员之间也可以进行比较,但只能用==,is等操作符,不支持大小比较
print(Girls.satori is Girls.mashiro)  # False
print(Girls.satori == Girls.mashiro)  # False
print(Girls.satori is Girls.sola)  # True,因为两者值一样,后者是前者的别名,两个指针指向了同一个地方
print(Girls.satori is Girls.sola)  # True

# 如果把1换成列表的话
class Girls(Enum):
    satori = [1, 2]
    mashiro = 2
    nagisa = 3
    tomoyo = 4
    kurisu = 5
    sola = [1, 2]
    kurumi = [1, 2]

print(Girls.satori is Girls.sola)  # True
print(Girls.satori is Girls.sola)  # True
print(Girls.kurumi is Girls.sola)  # True

# 会发现仍旧是True,尽管列表是可变类型,但如果值一样,会继续让sola的指针指向satori的指针所指向的内存
# 因为值一样,那么sola就看做是satori的引用
# 同理再加上一个kurumi是一样的结果
# 不用__members__的话,打印的仍然是第一个satori

  

python--enum的更多相关文章

  1. Python Enum 枚举 用法汇总

    Python Enum 枚举 用法汇总 import os import sys if sys.version_info.major + sys.version_info.minor * 0.1 &l ...

  2. Python enum 枚举 判断 key(键) 或者 value(值)是否在枚举中

    Python enum 枚举 判断 key(键) 或者 value(值)是否在枚举中 python 的基本用法请浏览:https://www.cnblogs.com/ibingshan/p/98564 ...

  3. python enum 枚举

    http://www.cnblogs.com/codingmylife/archive/2013/05/31/3110656.html python 3.4+ from enum import Enu ...

  4. 【python】Python: Enum枚举的实现

    从C#系语言过来用Python,好不容易适应了写代码不打花括号,突然有一天发现它居然木有枚举……于是stackoverflow了一把,发现神人的枚举(enum)实现到处都是,于是汉化总结过来. 如果是 ...

  5. 【转载】Python: Enum枚举的实现

    转自:http://www.cnblogs.com/codingmylife/archive/2013/05/31/3110656.html   从C系语言过来用Python,好不容易适应了写代码不打 ...

  6. protobuf, python Enum

    继承enum.Enum的python class,其实是一个, name-value的关系,可以直接className(value)得到一个类.比如 import enum class xx(enum ...

  7. Python中模拟enum枚举类型的5种方法分享

    这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下   以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...

  8. Python 的枚举 Enum

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

  9. python 枚举Enum

    常量是任何一门语言中都会使用的一种变量类型 如 要表示星期常量,我们可能会直接定义一组变量 JAN = 1 TWO = 2 ... 然后在返回给前端的时候,我们返回的就会是1,2,...这种魔法数字, ...

  10. Python 枚举 enum

    Python 枚举 enum enum 标准模块在 3.4 版本才可以使用,3.3 以下版本需要独立安装:https://pypi.python.org/pypi/enum34#downloads,官 ...

随机推荐

  1. Mysql 表转换成 Sqlite表

    目前的转换仅仅支持对没有外键的Mysql数据表 准备: 下载安装 Sqlite Expert 软件 一 获取Mysql中的.sql文件,获取过程省略可以直接导出sql文件 二 在Sqlite Expe ...

  2. 支付宝sdk 支付订单查询失败

    最近遇到了一些问题,厂商给我们反馈了一个问题,就是支付宝支付成功之后,旋转屏幕,订单查询失败.后来我怀疑是支付宝的问题,想都不用想是支付宝的问题. 但是自己根本你无法复现,因为我发现支付宝支付完成之后 ...

  3. JAVA中使用AES加密解密

    技术交流群: 233513714 /** * AES加密测试 * * @param str 加密参数 */ public void aesTest(String str) { log.info(&qu ...

  4. istringstream输入数据到数组

    istringstream iss(line); ; while (!(iss >> dat[n]).fail()) n++;

  5. android中dumpsys命令使用

    转自:https://testerhome.com/topics/1462 adb shell dumpsys,默认打印出当前系统所有service信息,在后面可加上具体的服务名 需要列出当前运行的服 ...

  6. Kotlin中功能操作与集合(KAD 11)

    作者:Antonio Leiva 时间:Feb 2, 2017 原文链接:https://antonioleiva.com/functional-operations-collections-kotl ...

  7. JMeter学习笔记(七) 导出文件接口测试

    导出文件接口,其实跟下载文件接口的测试类似,主要就是执行接口导出文件后保存到本地. 下载文件接口测试,参考文档:https://www.cnblogs.com/xiaoyu2018/p/1017830 ...

  8. Python处理Sqlite3数据库

    sqlite3比较小众 本章主要通过Python Code表述如何增.查.改.删 sqlite3 DB 一.直接上代码 #!/usr/bin/env python # -*- coding: utf- ...

  9. Oracle 监听/数据库 启动/关闭

    LSNRCTL命令启动.关闭和查看监听器的状态的方法 从lsnrctl status命令的输出中得到监听器状态,包括如下的信息: 监听器的启动时间 监听器的运行时间 监听器参数文件listener.o ...

  10. linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案(转)

    linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案 1 问题描述 服务器内存满了,ssh登录失败 , ...