我们在python应用开发中,经常会遇到有定义常量的需求,通常的做法是使用大写变量通过整数来定义,例如会员等级:
# 大众会员
PUBLIC = 1
# 黄金会员
GOLD = 2
# 铂金会员
PLATINUM = 3
# 钻石会员
DIAMOND = 4
这样做的好处是简单,缺点是类型是int,并且仍然是变量。
好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python3 提供了Enum类来实现这个功能,代码示例(通过继承IntEnum):
import enum
from enum import IntEnum
@enum.unique
class VipLevel(IntEnum):
"""
会员等级枚举类
"""
PUBLIC = 1,
GOLD = 2,
PLATINUM = 3,
DIAMOND = 4
@classmethod
def value_str(cls, key):
"""
使用字典的方式模拟switch语句
"""
key_map = {
cls.PUBLIC.value: "大众会员",
cls.GOLD.value: "黄金会员",
cls.PLATINUM.value: "铂金会员",
cls.DIAMOND.value: "钻石会员"
}
return key_map.get(key, "")
@classmethod
def is_contains(cls, key):
for name, member in cls.__members__.items():
if key == member.value:
return True
return False
if __name__ == "__main__":
# 存储层进行数据保存时,可以使用具体的会员等级类型数值
print(VipLevel.DIAMOND.value)
# 输出:
"""
4
"""
# 应用层组装数据时,可以根据会员等级类型数值获取会员等级名称
print(VipLevel.value_str(4))
# 输出:
"""
钻石会员
"""
# 判断会员等级类型数值是否合法
print(VipLevel.is_contains(4))
# 输出:
"""
True
"""
print(VipLevel.is_contains(5))
# 输出:
"""
False
"""