如果想表示枚举,可以用哪些方式呢?以下是我们能想到的可用来表示枚举的方法。
1 | # 方法一 |
上述三种方法都存在着不足,例如:枚举变量可变,且没有防止相同值的功能。
1 | # 枚举变量可变 |
枚举其实是个类
python2中没有枚举类型,python3中增加了枚举类型。所有的枚举类型都是 Enum
的子类。建议枚举类中所有的属性名称均为大写。
枚举类和普通类的区别在于:访问枚举属性时,并无法打印出属性值,而是返回类名.属性名
。
枚举与普通类的区别:
- 枚举类中变量不可重新赋值
- 枚举类不能具有相同标签的,但可以具有相同的枚举值
1 | from enum import Enum |
这里需要注意的是枚举类可以具有相同的枚举值,重复的枚举值对应的枚举名的别名。在下例中,VIP.GREEN
被认为是VIP.YELLOW
的别名。
1 | from enum import Enum |
枚举类型、枚举名称与枚举值
访问枚举值:value
属性
访问枚举名称:name
属性
1 | from enum import Enum |
枚举是可以遍历的
1 | for v in VIP: |
枚举的比较运算
枚举可以进行如下比较运算:
- 等值比较(==)
- 身份比较(is)
枚举无法进行如下比较运算:
- 大小比较(<,>)
枚举类内部变量的比较
1 | from enum import Enum |
枚举类之间的比较
1 | from enum import Enum |
枚举转换
编写代码时,尽量不用枚举值,而使用枚举名称,更具有可读性。
1 | from enum import Enum |
枚举的其他一些碎碎念
IntEnum
当枚举值中不允许出现字符串,只能是整形时,可继承 IntEnum
类。
例如在下例中,由于'str'
为字符串类型,则代码会报错。
1 | from enum import IntEnum |
@unique 装饰器
如果希望避免一个枚举类中存在相同的枚举值,则可增加@unique
装饰器。在下例中,由于YELLOW和GREEN都有相同的
1 | from enum import IntEnum,unique |
单例模式
枚举是单例模式,不能进行实例化。