# 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. Android开发——View滑动冲突解决方案

    0. 前言   我们在Android开发--事件分发机制详解中深入学习了事件分发机制,为我们解决Android开发中的滑动冲突问题做了初步准备.针对滑动冲突这里给出两种解决方案:外部拦截法和内部拦截法 ...

  2. Android getLocationInWindow

    参考博客: http://blog.sina.com.cn/s/blog_44d19b500102vpve.html 这篇博客,我看了三遍,终于看懂了.恩,我就喜欢这样不放弃的自己. 1.getLoc ...

  3. 剑指Offer - 九度1362 - 左旋转字符串(Move!Move!!Move!!!)

    剑指Offer - 九度1362 - 左旋转字符串(Move!Move!!Move!!!)2013-11-23 03:05 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任 ...

  4. mysql错误:Column ‘id’ in field list is ambiguous的解决方法

    [Err] 1052 - Column 'modify_time' in where clause is ambiguous 出错的语句: SELECT AVG(T.se)%60FROM( SELEC ...

  5. 【Python】python模块加载

    一个python文件就是一个模块 标准模块 python自带的模块就是标准模块,也就说可以直接import进来的就是标准模块 import datetime import random 第三方模块 别 ...

  6. 课时1:我和python的第一次亲密接触

    目录: 一.Python3的下载与安装 二.从IDIE启动Python 三.尝试点新的东西 四.为什么会这样? 五.课时01课后习题及答案 ============================== ...

  7. URAL 1684. Jack's Last Word ( KMP next函数应用 )

    题意:问第二行的串能不能恰好分割成几个串,使得这几个串都是第一行串的前缀.如果是,输出No, 并输出这几个串,否则输出Yes. 这题是Special Judge,把两个串连接起来,中间用一个未出现过的 ...

  8. JavaSE复习(一)继承多态与常用API

    继承与多态 在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式: 直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,没有则向上找 间接通过成员方法访问成员变量:该方法属于 ...

  9. HDU 1937 J - Justice League

    J - Justice League Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  10. Java中Object.equals和String.equals的区别详解

    前言 Java中的堆和常量池的区别是什么呢?Object.equals与String.equals的区别呢?下面让我们通过一个小示例让你明白它- 1.基础知识 Java的存储空间:寄存器.栈.堆.静态 ...