美文网首页python基础
Enum类(枚举类)

Enum类(枚举类)

作者: 徐子鑑 | 来源:发表于2017-09-22 20:19 被阅读14次

Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。
py2版本需要pip安装pip install --upgrade pip enum34

from enum import Enum
# (Enum当函数的用法)定义一个class类型Month,然后,每个常量都是class的一个唯一实例 
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
#value属性则是自动赋给成员的int常量,默认从1开始计数。

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

结果如下

Jan => Month.Jan , 1
Feb => Month.Feb , 2
Mar => Month.Mar , 3
Apr => Month.Apr , 4
May => Month.May , 5
Jun => Month.Jun , 6
Jul => Month.Jul , 7
Aug => Month.Aug , 8
Sep => Month.Sep , 9
Oct => Month.Oct , 10
Nov => Month.Nov , 11
Dec => Month.Dec , 12

1. 枚举的定义

首先,定义枚举要导入enum模块。
枚举定义用class关键字,继承Enum类。
用于定义枚举的class和定义类的class是有区别【下一篇博文继续分享】。

示例代码:

from enum import Enum
class Color(Enum): 
        red = 1 
        orange = 2 
        yellow = 3 
        green = 4 
        blue = 5 
        indigo = 6 
        purple = 7

代码分析:
上面的代码,我们定义了颜色的枚举Color.
颜色枚举有7个成员,分别是Color.red、Color.orange、Color.yellow等。
每一个成员都有它们各自名称和值,Color.red成员的名称是:red,值是:1。
每个成员的数据类型就是它所属的枚举。【*注:用class定义的类,实际上就是一种类型】

1.1 定义枚举时,成员名称不允许重复   

from enum import Enum
class Color(Enum): 
    red = 1 
    red = 2

上面的代码,就无法执行。提示错误:TypeError: Attempted to reuse key: 'red'
 
1.2 默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名****  

from enum import Enum
class Color(Enum): 
    red = 1 
    red_alias = 1

成员Color.red和Color.red_alias具有相同的值,那么成员Color.red_alias的名称red_alias就被视作成员Color.red名称red的别名。

** 1.3 如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员**

from enum import Enum
class Color(Enum): 
    red = 1 
    red_alias = 1

print(Color(1))

输出结果为:Color.red

1.4 如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique【要导入unique模块】

from enum import Enum, unique
@unique
class Color(Enum): 
    red = 1 
    red_alias = 1

再执行就会提示错误:ValueError: duplicate values found in <enum 'Color'>: red_alias -> red

2. 枚举取值

2.1 通过成员的名称来获取成员

Color['red']

2.2 通过成员值来获取成员

Color(2)

2.3 通过成员,来获取它的名称和值

red_member = Color.red
red_member.name
red_member.value

3. 迭代器

3.1 枚举支持迭代器,可以遍历枚举成员

for color in Color:
    print(color)

输出结果是,枚举的所有成员。
Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。

3.2 如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员

from enum import Enumclass 
Color(Enum): 
    red = 1 
    orange = 2 
    yellow = 3 
    green = 4 
    blue = 5 
    indigo = 6 
    purple = 7 
    red_alias = 1
for color in Color: 
    print(color)

输出结果是:
Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。
但是Color.red_alias并没有出现在输出结果中。

3.3 如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性members

from enum import Enum
class Color(Enum): 
    red = 1 
    orange = 2 
    yellow = 3 
    green = 4 
    blue = 5 
    indigo = 6 
    purple = 7 
    red_alias = 1
for color in Color.__members__.items(): 
    print(color)

输出结果:
('red', <Color.red: 1>)、('orange', <Color.orange: 2>)、('yellow', <Color.yellow: 3>)、('green', <Color.green: 4>)、('blue', <Color.blue: 5>)、('indigo', <Color.indigo: 6>)、('purple', <Color.purple: 7>)、('red_alias', <Color.red: 1>)

4. 枚举比较

4.1 枚举成员可进行同一性比较

Color.red is Color.red

输出结果是:True

Color.red is not Color.blue

输出结果是:True

4.2 枚举成员可进等值比较

Color.blue == Color.red

输出结果是:False

Color.blue != Color.red

输出结果是:True

4.3 枚举成员不能进行大小比较

Color.red < Color.blue

输出结果出错:
TypeError: unorderable types: Color() < Color()

相关文章

  • 枚举学习

    java enum枚举类 enum(枚举)类介绍 **java枚举类是一组预定义常量的集合,使用enum关键字声明...

  • 枚举

    一、概念: 实例有限而且固定的类,在java里被称为枚举类。 二、通过enum实现枚举类 使用enum定义的枚举类...

  • Python_枚举

    一、枚举 Enum类 Python中所有枚举类型都是enum模块下的Enum类的子类。 枚举中的标识最好全部使用大...

  • Kotlin学习笔记之 11 枚举类

    11.Kotlin 枚举类 枚举类初始化关键字是enum,kotlin中的枚举类初始化可以有参数,比如:enum ...

  • 枚举

    枚举 定义枚举类要用关键字enum 所有枚举类都是Enum的子类 枚举类的第一行上必须是枚举项,最后一个枚举项后的...

  • 枚举

    如何定义枚举类 什么枚举类:类里的对象是有限个,可以枚举出来 如何使用enum定义枚举类 枚举...

  • Enum类(枚举类)

    Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。py2版本需要pip安...

  • Chapter 8 . 枚举

    阅读原文 Chapter 8 . 枚举 8.1 枚举类 主要内容: 如何自定义枚举类 如何使用enum定义枚举类 ...

  • Java篇-枚举的使用

    一 : 自定义枚举类 枚举类调用 二 : 使用enum关键字定义枚举类 让枚举类实现接口: 可以让不同的枚举类的对...

  • Java核心类-枚举类

    Java 进阶——枚举enum使用小结及使用枚举替代你的常量类 通过enum定义的枚举类,和其他的class没有任...

网友评论

    本文标题:Enum类(枚举类)

    本文链接:https://www.haomeiwen.com/subject/gutqextx.html