# 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. FCS校验 C语言简单实现

    static uint8 calcFCS(uint8 *pBuf, uint8 len){  uint8 rtrn = 0;  while (len--)  {    rtrn ^= *pBuf++; ...

  2. linux下解压命令大全[转]

    本文是复制大神的博文, 供自己参考. 原文出处:http://www.cnblogs.com/eoiioe/archive/2008/09/20/1294681.html .tar 解包:tar xv ...

  3. __bridge 使用注意

    前奏 在平常开发中,我们可能遇到 CoreFoundation(CF) 框架的对象和 OC 对象之间的类型转换,这时候我们需要 __bridge 来帮忙 注意 : 如果是使用 CF __bridge ...

  4. quick sort去除无用判断

    #include <stdio.h> #include <stdlib.h> //int a[]={1000,10000,9,10,30,20,50,23,90,100,10} ...

  5. 剑指Offer - 九度1503 - 二叉搜索树与双向链表

    剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...

  6. 《Cracking the Coding Interview》——第1章:数组和字符串——题目8

    2014-03-18 02:12 题目:判断一个字符串是否由另一个字符串循环移位而成. 解法:首先长度必须相等.然后将第一个串连拼两次,判断第二个串是否在这个连接串中. 代码: // 1.8 Assu ...

  7. linux运维笔记

    一.查找大文件 sudo find / -size +100M -exec ls -lh {} \;

  8. 线段树 (区间更新,区间查询) poj http://poj.org/problem?id=3468

    题目链接 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  9. python完成留言板功能

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8&quo ...

  10. 贪吃蛇StringBuilder 和 定时器

    ConsoleKeyInfo info = Console.ReadKey(); while (true) { if (info.Key == ConsoleKey.UpArrow)//只能输入一次但 ...