最后更新:2022-07-29 09:07:19 手机定位技术交流文章
一些具有特殊含义的类,其实例化对象的个数往往是固定的,比如用一个类表示月份,则该类的实例对象最多有 12 个;再比如用一个类表示季节,则该类的实例化对象最多有 4 个。
对于这个特定的类,Python 3.4添加了一个新的Enum排列类,换句话说,这些对象的实例数中固定的类可以由排列类定义。
例如,下面的程序显示如何定义一个排列类:
from enum import Enum
class Color(Enum):
#指定序列值的值
red = 1
green = 2
blue = 3
如果想将一个类定义为枚举类,只需要令其继承自 enum 模块中的 Enum 类即可。例如在上面程序中,Color 类继承自 Enum 类,则证明这是一个枚举类。
在颜色排列类别中,红色、绿色和蓝色都是类的成员(可以理解的类变量)。注意,列举类的每个成员由两个部分组成,分别为 name 和 value,名称属性值是列举值的变量名称(例如红色),该值代表列举值的序列(序列通常以1开始)。
和普通类的用法不同,枚举类不能用来实例化对象,但这并不妨碍我们访问枚举类中的成员。访问枚举类成员的方式有多种,例如以 Color 枚举类为例,在其基础上添加如下代码:
#调用3种方法来列举成员
print(Color.red)
print(Color[‘red’])
print(Color(1))
#调取枚举成员中的 value 和 name
print(Color.red.value)
print(Color.red.name)
#2个浏览排列类的所有成员的方法
for color in Color:
print(color)
程序输出结果为:
Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue
不能比较列举的类成员的大小,但可以使用==或是比较它们是否等价,例如:
print(Color.red == Color.green)
print(Color.red.name is Color.green.name)
输出结果为:
Flase
Flase
需要注意的是,枚举类中各个成员的值,不能在类的外部做任何修改,也就是说,下面语法的做法是错误的:
Color.red = 4
除此之外,该枚举类还提供了一个members属性,该属性是一个包含枚举类中所有成员的字典,通过遍历该属性,也可以访问枚举类中的各个成员。例如:
for name,member in Color.members.items():
print(name,“->”,member)
输出结果为:
red -> Color.red
green -> Color.green
blue -> Color.blue
值得一提的是,Python 枚举类中各个成员必须保证 name 互不相同,但 value 可以相同,举个例子:
from enum import Enum
class Color(Enum):
#指定序列值的值
red = 1
green = 1
blue = 3
print(Color[‘green’])
输出结果为:
Color.red
可以看到,Color 枚举类中 red 和 green 具有相同的值(都是 1),Python允许这种情况发生,它会将 green 当做是 red 的别名,所以当我访问绿党成员时,最后的输出是红色。
在实际的编程过程中,如果你想避免这种情况,你可以使用@unique decorator,这样程序会报告一个valueError错误,当列举类的一个成员出现同一个值。 例如:
# 介绍独一无二
from enum import Enum,unique
#添加一个独特的装饰
@unique
class Color(Enum):
#指定序列值的值
red = 1
green = 1
blue = 3
print(Color[‘green’])
运行程序会报错:
Traceback (most recent call last):
File “D:python3.6demo.py”, line 3, in
class Color(Enum):
File “D:python3.6libenum.py”, line 834, in unique
(enumeration, alias_details))
ValueError: duplicate values found in <enum ‘Color’>: green -> red
除了通过继承Enum类创建一个排列类之外,Enum()函数还可以创建一个排列类。例如:
from enum import Enum
#创建一个枚举类
Color = Enum(“Color”,(‘red’,‘green’,‘blue’))
#调用3种方法来列举成员
print(Color.red)
print(Color[‘red’])
print(Color(1))
#调取枚举成员中的 value 和 name
print(Color.red.value)
print(Color.red.name)
#2个浏览排列类的所有成员的方法
for color in Color:
print(color)
Enum()函数接受两个参数,第一个是指定排列类的类名,第二个是指定排列类的多个成员。
如上面所示,创建一个与以前的颜色类相同的编列类,仅通过一个代码行。 一个运行程序的输出结果是:
Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue
本文由 在线网速测试 整理编辑,转载请注明出处。