▒ 目录 ▒
- 🛫 问题
- 描述
- 环境
- 1️⃣ 枚举的基本使用
- 自定义枚举成员的值
- 枚举值唯一:@unique
- 枚举成员的别名:@property
- 枚举成员的元数据
- 2️⃣ 实现枚举属性的自增长
- python3.6+
- python3.5.2
- python2不支持enum模块
- 🛬 结论
- 📖 参考资料
🛫 问题
描述
学过c的都知道,c中有enum,可以定义一组特定值的常量。
python也拥有类似的能力,不过,它不是语法层次的,而是以类库的形式提供给开发者。
今天我们就来说说python中的枚举,并通过它实现枚举属性的自增长
环境
版本号 | 描述 | |
---|---|---|
文章日期 | 2023-06-29 | |
操作系统 | Win11 - 21H2 - 22000.1335 | |
Python | 3.7.1 | |
Python | 3.5.2 | |
1️⃣ 枚举的基本使用
自定义枚举成员的值
在Python中,使用
enum
模块来创建枚举类型。枚举类型定义了一组具有命名值的常量。
可以使用枚举类型来避免硬编码常量,并提高代码的可读性和可维护性。
以下是使用
enum
模块创建枚举类型的示例:
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
print(Color.RED) # Color.RED
print(Color.RED.name) # RED
print(Color.RED.value) # 1
在上面的示例中,定义了一个名为
Color
的枚举类型,它有三个常量:RED
、GREEN
和BLUE
。每个常量都有一个名称
和一个值
。可以使用常量的名称和值来访问它们。
枚举类型的名称必须是唯一的,但值可以重复。可以使用枚举类型的
name
属性获取常量的名称,使用value
属性获取常量的值。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 5
NEXT = 5
END = BLUE
print(Color.RED) # Color.RED
print(Color.RED.name) # RED
print(Color.NEXT.value) # 5
print(Color.END.value) # 5
枚举值唯一:@unique
可以使用@unique装饰器来防止枚举成员具有相同的值。
from enum import Enum, unique
@unique
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
@property
def name(self):
return self.name.lower()
@classmethod
def from_name(cls, name):
return cls[name.upper()]
当定义相同的值
NEXT = 5
时,会报错。
枚举成员的别名:@property
可以通过自定义属性,将枚举成员的名称转换为大写或小写。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
@property
def nameX(self):
return self.name.lower()
print(Color.RED) # Color.RED
print(Color.RED.name) # RED
print(Color.RED.nameX) # red
枚举成员的元数据
from enum import Enum
class Color(Enum):
RED = ('Red Color', True)
GREEN = ('Green Color', False)
BLUE = ('Blue Color', True)
def __init__(self, description, flag):
self._description_ = description
self._flag_ = flag
@property
def description(self):
return self._description_
@property
def flag(self):
return self._flag_
print(Color.GREEN.name) # GREEN
print(Color.GREEN.value) # ('Green Color', False)
print(Color.GREEN.description) # Green Color
print(Color.GREEN.flag) # False
2️⃣ 实现枚举属性的自增长
开发中,经常定义庞大的枚举类型,这时候我们一个个去调整枚举的数值,会非常的麻烦,接下来就通过特殊手段实现枚举类型的值自增长。
python3.6+
python3.7中,我们可以通过
auto
这个class
,自动的实现Ordinal的类属性自动增加,从而完成想要的功能。
from enum import IntEnum, Enum, auto
class Color(IntEnum):
NORTH = 3
SOUTH = auto()
EAST = auto()
WEST = auto()
print(Color.NORTH.value) # 3
print(Color.SOUTH.value) # 4
print(Color.EAST.value) # 5
print(Color.WEST.value) # 6
python3.5.2
将python环境从3.7切换到3.5.2,我们会发现下面报错内容:
从图中可以看出,python3.5.2中并没有实现auto类,难道python3.5.2不能实现自增长吗?只能使用最原始的,给每个值手动赋值的方式吗?
为了一探究竟,小编翻了翻python文档,文档中给了两种方案:
方案一: 使用Enum类的构造函数
文档中的用法如下:
示例代码:
from enum import Enum
Animal = Enum('Animal', 'ant bee cat dog', start=4)
print(Animal.ant) # Animal.ant
print(Animal.cat.value) # 6
方案二: 使用Enum类的构造函数
下面是python文档给的例子,实现自增长的枚举,这也可能就是后期python版本中的实现了。
class AutoNumber(Enum):
def __new__(cls):
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value
return obj
class Color(AutoNumber):
red = ()
green = ()
blue = ()
print(Color.green.value) # 2
不过这个代码功能实在有限,red = ()不能改为red = 3,也就是说,不能指定初始值。
所以在python3.5中,直接使用方案一,就可以了。
python2不支持enum模块
这个没啥说的,就是不支持这个库,直接报错。
没有python2的用户,可以直接通过在线工具尝试该功能:https://c.runoob.com/compile/6/。
🛬 结论
查了些资料,说auto()这种用法是python3.6的新特性,闹心了,看来不使用新版本的python,很多功能就无法使用。对于无法更新版本的公司(线上稳定版本是旧的python版本,最新版本python无法稳定运行的情况),只能自己想办法实现类似的功能了。
📖 参考资料
- 在线编译环境 https://c.runoob.com/compile/9/