python基础——枚举类

  当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份:

  1. JAN = 1
  2. FEB = 2
  3. MAR = 3
  4. ...
  5. NOV = 11
  6. DEC = 12

  好处是简单,缺点是类型是int,并且仍然是变量。

  更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python提供了Enum类来实现这个功能:

  1. from enum import Enum
  2.  
  3. Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

  这样我们就获得了Month类型的枚举类,可以直接使用Month.Jan来引用一个常量,或者枚举它的所有成员:

  1. for name, member in Month.__members__.items():
  2. print(name, '=>', member, ',', member.value)

  value属性则是自动赋给成员的int常量,默认从1开始计数

  如果需要更精确地控制枚举类型,可以从Enum派生出自定义类:

  1. from enum import Enum, unique
  2.  
  3. @unique
  4. class Weekday(Enum):
  5. Sun = 0 # Sun的value被设定为0
  6. Mon = 1
  7. Tue = 2
  8. Wed = 3
  9. Thu = 4
  10. Fri = 5
  11. Sat = 6

  @unique装饰器可以帮助我们检查保证没有重复值

  访问这些枚举类型可以有若干种方法:

  1. >>> day1 = Weekday.Mon
  2. >>> print(day1)
  3. Weekday.Mon
  4. >>> print(Weekday.Tue)
  5. Weekday.Tue
  6. >>> print(Weekday['Tue'])
  7. Weekday.Tue
  8. >>> print(Weekday.Tue.value)
  9. 2
  10. >>> print(day1 == Weekday.Mon)
  11. True
  12. >>> print(day1 == Weekday.Tue)
  13. False
  14. >>> print(Weekday(1))
  15. Weekday.Mon
  16. >>> print(day1 == Weekday(1))
  17. True
  18. >>> Weekday(7)
  19. Traceback (most recent call last):
  20. ...
  21. ValueError: 7 is not a valid Weekday
  22. >>> for name, member in Weekday.__members__.items():
  23. ... print(name, '=>', member)
  24. ...
  25. Sun => Weekday.Sun
  26. Mon => Weekday.Mon
  27. Tue => Weekday.Tue
  28. Wed => Weekday.Wed
  29. Thu => Weekday.Thu
  30. Fri => Weekday.Fri
  31. Sat => Weekday.Sat

  可见,既可以用成员名称引用枚举常量,又可以直接根据value的值获得枚举常量

小结

  Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。

参考源码:

  1. #python 枚举类 示例
  2. #2016-8-30 18:55:25
  3. #MengmengCoding
  4. # -*- coding: utf-8 -*-
  5.  
  6. from enum import Enum
  7.  
  8. #Enum是一个枚举类
  9. #Month,Weekday各为一个Enum类的实例化
  10. Month=Enum('Month',('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
  11. Weekday=Enum('Weekday',('Mon','Tue','Wed','Thu','Fri','Sat','Sun'))
  12.  
  13. for name,member in Month.__members__.items():
  14. print(name,'=>',member,',',member.value)
  15.  
  16. print('--------cut-off line--------')
  17. #输出:
  18. '''
  19. Jan => Month.Jan , 1
  20. Feb => Month.Feb , 2
  21. Mar => Month.Mar , 3
  22. Apr => Month.Apr , 4
  23. May => Month.May , 5
  24. Jun => Month.Jun , 6
  25. Jul => Month.Jul , 7
  26. Aug => Month.Aug , 8
  27. Sep => Month.Sep , 9
  28. Oct => Month.Oct , 10
  29. Nov => Month.Nov , 11
  30. Dec => Month.Dec , 12
  31. '''
  32.  
  33. for name,member in Weekday.__members__.items():
  34. print(name,'=>',member,',',member.value)
  35.  
  36. print('--------cut-off line--------')
  37. #输出:
  38. '''
  39. Mon => Weekday.Mon , 1
  40. Tue => Weekday.Tue , 2
  41. Wed => Weekday.Wed , 3
  42. Thu => Weekday.Thu , 4
  43. Fri => Weekday.Fri , 5
  44. Sat => Weekday.Sat , 6
  45. Sun => Weekday.Sun , 7
  46. '''
  47.  
  48. #如果需要更精确地控制枚举类型,可以从Enum派生出自定义类
  49. #这里还是用周来举例吧,谁让我见识少呢~
  50. #用WeekDay来区别之前的Weekday吧
  51.  
  52. from enum import Enum,unique
  53.  
  54. @unique #@unique装饰器可以帮助我们检查保证没有重复值
  55. class WeekDay(Enum): #由Enum类派生得到
  56. Sun=0
  57. Mon=1
  58. Tue=2
  59. Wed=3
  60. Thu=4
  61. Fri=5
  62. Sat=6
  63.  
  64. day1=WeekDay.Mon
  65.  
  66. print('day1=',day1)
  67. print('WeekDay.Tue=',WeekDay.Tue)
  68. print('WeekDay[\'Tue\']=',WeekDay['Tue'])
  69. print('WeekDay.Tue.value=',WeekDay.Tue.value)
  70. print('day1==WeekDay.Mon ?',day1==WeekDay.Mon)
  71. print('day1==WeekDay.Tue ?',day1==WeekDay.Tue)
  72. print('day1==WeekDay(1) ?',day1==WeekDay(1))
  73.  
  74. #输出:
  75. '''
  76. day1= WeekDay.Mon
  77. WeekDay.Tue= WeekDay.Tue
  78. WeekDay['Tue']= WeekDay.Tue
  79. WeekDay.Tue.value= 2
  80. day1==WeekDay.Mon ? True
  81. day1==WeekDay.Tue ? False
  82. day1==WeekDay(1) ? True
  83. '''
  84.  
  85. print('--------cut-off line--------')
  86.  
  87. for name,member in WeekDay.__members__.items():
  88. print(name,'=>',member)
  89.  
  90. #输出:
  91. '''
  92. Sun => WeekDay.Sun
  93. Mon => WeekDay.Mon
  94. Tue => WeekDay.Tue
  95. Wed => WeekDay.Wed
  96. Thu => WeekDay.Thu
  97. Fri => WeekDay.Fri
  98. Sat => WeekDay.Sat
  99. '''

python基础——枚举类的更多相关文章

  1. python基础——定制类

    python基础——定制类 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方 ...

  2. Python基础-类的探讨(class)

    Python基础-类的探讨(class) 我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法  Python ...

  3. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  4. python,使用枚举类,面向对象高级编程

    python #针对常量 #枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例. from enum import Enum Month = Enum('Month', ('J ...

  5. python基础(26):类的成员(字段、方法、属性)

    1. 字段 字段:包括普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同. 普通字段属于对象 静态字段属于类 字段的定义和使用: class Province: # ...

  6. java基础---枚举类与注解

    一.枚举类 类的对象只有有限个,确定的.我们称此类为枚举类 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. 定义枚举类 方式一:jdk5.0之前,自定义枚举类 public class Se ...

  7. Python基础(十一) 类继承

    类继承: 继承的想法在于,充份利用已有类的功能,在其基础上来扩展来定义新的类. Parent Class(父类) 与 Child Class(子类): 被继承的类称为父类,继承的类称为子类,一个父类, ...

  8. python基础编程——类和实例

    在了解类和实例之前,需要先了解什么是面向对象,什么又是面向过程.面向过程是以过程为中心实现一步步操作(相互调用,类似流水线思想):面向对象是以事物为中心,某个事物可以拥有自己的多个行为,而另一个事物也 ...

  9. python基础----元类metaclass

    1 引子 class Foo: pass f1=Foo() #f1是通过Foo类实例化的对象 python中一切皆是对象,类本身也是一个对象,当使用关键字class的时候,python解释器在加载cl ...

随机推荐

  1. Android 网络请求框架android-async-http问题

    今天通过接口请求服务器的一些app数据,发现一个很奇怪的问题,请求一个链接的时候,通常在第一次请求发起的时候没有什么问题,能很快的拿到数据,但是 往后再去请求的时候就会等待很久,而且最后会请求失败,一 ...

  2. mysql 设置可以外部访问

    GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;   --授权可以外部 ...

  3. GNU KHATA——开源的会计管理软件

    导读 GNU Khata是一个会计工具. 或者,我应该说成是一系列的会计工具集合,它就像经济管理方面的Evernote一样.它的应用是如此之广,以至于它不但可以用于个人的财务管理,也可以用于大型公司的 ...

  4. 机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?

    前几天搜狗的一道笔试题,大意是在随机森林上增加一棵树,variance和bias如何变化呢? 参考知乎上的讨论:https://www.zhihu.com/question/27068705 另外可参 ...

  5. Ubuntu 中安装 NetBeans IDE

    NetBeans 8.2 刚刚发布,如果你还没有安装的话,这篇简短的教程将会演示如何在 Ubuntu 系统上快速的安装.对安装 NetBeans 需要帮助的开发者来说,这往篇文章会是不错的指导. 给那 ...

  6. javascript 常用技巧

    1. 将彻底屏蔽鼠标右键 oncontextmenu=”window.event.returnValue=false” < table border oncontextmenu=return(f ...

  7. MySql 导出excel

    select * into outfile './bestlovesky.xls' from bestlovesky where 1 order by id desc  limit 0, 50;

  8. 如何解决phpcms后台验证码不显示的问题

    方法一: 主要在于是否开启gd库 查看办法 找到php.ini文件 搜索extension=php_gd2.dll这段代码(windows) 然后把前面的;符号去掉即可. centOS6.5中可能需要 ...

  9. git stash简介

    原文:http://gitbook.liuhui998.com/4_5.html 一.基本操作 当你正在做一项复杂的工作时, 发现了一个和当前工作不相关但是又很讨厌的bug. 你这时想先修复bug再做 ...

  10. C++ 中超类化和子类化

    超类化和子类化没有具体的代码,其实是一种编程技巧,在MFC和WTL中可以有不同的实现方法. 窗口子类化: 原理就是改变一个已创建窗口类的窗口过程函数.通过截获已创建窗口的消息,从而实现监视或修改已创建 ...