python之枚举类型

Python012

python之枚举类型,第1张

枚举是在 Python3.4 添加的新功能。Python3.4 之前的版本可以使用,但是不能直接使用,使用之前需要先用 pip install enum 安装。

1.1什么是枚举?

枚举可看作是一系列符号名称的集合,集合中每一个元素要保证唯一性和不可变,因此我们可以对枚举中元素进行恒等比较,通俗来讲枚举就是一系列常量的集合,枚举是可迭代的。

1.2枚举有什么作用?

枚举具有不可变的特性,所以枚举的主要作用就是用来定义常量的。

2.1 创建

枚举语法与 class 语法相同:枚举的定义可以通过继承 Enum 的方式来实现, 看一下示例:

2.2 访问

枚举成员及属性的访问如下所示:

枚举的迭代也很简单,如下所示:

2.3 比较

枚举成员及属性可以使用 is 进行对象比较,还可以使用 == 进行值比较,看下示例:

枚举成员不能进行大小比较,如下所示:

2.4 确保枚举值唯一

我们定义枚举时,成员名称是不可以重复的,但成员值是可以重复的,如果想要保证成员值不可重复,可以通过装饰器 @unique 来实现,如下所示:

参考: https://docs.python.org/zh-cn/3/library/enum.html#enum.IntEnum

Python学习日记

enum是一组绑定到唯一常数值的符号名称,并且具备可迭代性和可比较性的特性。我们可以使用enum创建具有良好定义的标识符,而不是直接使用魔法字符串或整数,也便于开发工程师的代码维护。

我们可以使用class语法创建一个枚举类型,方便我们进行读写,另外,根据函数API的描述定义,我们可以创建一个enum的子类,如下:

enum自带属性name和value ,日常工作中使用最多的也是这两个属性,我们打印看看结果:

枚举支持迭代和遍历顺序。举个例子:

打印结果:

可以看出,遍历的每一个status是一个独立的枚举成员,拥有name和value属性。

另外,我们也可以使用如下形式来进行枚举遍历:

上 面我们创建的枚举类中, value值是可以重复的,如果我们不想枚举类中的值重复可以是用装饰器@unique ,举例如下:

我们运行后,报如下异常:

我们查看源代码,发现加入此装饰器的枚举类型, unique方法会将其__members__.items()进行遍历,追加到duplicates列表中,如果发现列表不为空,则抛出如上异常信息。

此功能用于我们在使用枚举时,只在意枚举的标识符的含义而不在意值的情况下,但是如果需要与字符串或整数混合使用就要额外注意。下面贴上官方的示例:

可以发现,使用auto()得到的是整数自增型,如果我们需要别的方式,只需要在我们的枚举类中,重写_generate_next_value_方法。

枚举对象可以进行比较,但是不能进行值比较,如果需要进行值比较则需要枚举对象继承IntEnum对象,举个例子:

上 面的测试例子当中,我们创建了两个继承类型不一样的枚举类,可以看到继承了IntEnum的Season可以进行值的比较,而继承了Enum的Part则不能进行值比较,并且IntEnum类型与Enum类型也不能进行比较,即使属性和值一样。

枚举中可以定义枚举类自身特有的方法,也可以复写一些已经在基类中定义好的方法,比如:__init__ ,__str__ , __repr__ , __hash__ , __format__等。举个例子:

上面我们定义了一个枚举类,其中value是一个枚举类型,我们可以定义__init__方法去对应元组中的值,我们也复写了__str__方法。

打印方法看看效果:

从输出结果看,我们自定义和复写的方法都已经成功的应用到了Mood类中。

不同于java中的枚举类,python中的枚举类是可以被继承的,但是被继承的枚举类规定其不能定义任何成员,但可以定义抽象方法。举例如下:

测试用例可以完美运行,我们可以发现:第一个方法中,抛出了TypeError的异常;第二个测试方法中, MoreColor继承了Color ,Color继承了Shade , 并且我们可以通过子类调用父类中的方法。

主要介绍了enum模块的基础知识,包含枚举的创建、枚举成员和属性的访问、枚举方法的创建、枚举的继承等。其中新版中的_ignore_ 、 _order_ 、 _missing_等可以学习官网的例子,另外enum的子类IntEnum 、 IntFlag 等也是我们比较常用的枚举基类,本文中简单的介绍了IntEnum , 而IntFlag相比与IntEnum多了&, |, ^, ~的操作,其他的子类大家感兴趣也可以了解。