Python 枚举类
2021-07-15 本文已影响0人
Rethink
Python v3.8.5
如果想将一个类定义为枚举类,只需要令其继承自enum
模块(内置)中的 Enum
类即可。枚举类具有以下特点:
- 枚举类不支持实例化;
- 成员的值不能在类的外部做任何修改,每个成员都有
name
,value
两个属性,其中name为该枚举值的名称,value为该枚举值的内容; - 定义枚举时,成员名称不允许重复,但在默认情况下,不同的成员值允许相同,两个相同值的成员,第二个成员的名称将会被视作第一个成员的别名,若要限制不能定义相同值的成员。可以使用装饰器
@unique
; - 枚举支持迭代器,可以遍历枚举成员;如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员,若想把值重复的成员也遍历出来,要用枚举的一个特殊属性:
__members__
;
在自己的web项目中,接口响应状态码枚举类部分代码如下:
from enum import Enum, unique
from typing import Optional
@unique
class APIStatusCode(Enum):
"""接口响应状态码枚举类
"""
SUCCESS = {1: "Success"}
UNKNOWN_ERROR = {-1: "Unknown Error"}
PARAMETER_ERROR = {10232: "Parameter Error"}
@property
def code(self):
"""根据枚举值取状态码 -> `code` """
# self is the member here
return list(self.value.keys())[0]
@property
def message(self):
"""根据枚举值取状态码说明 -> `message` """
return list(self.value.values())[0]
@classmethod
def message_by_code(cls, code) -> Optional[str]:
"""根据状态码获取状态码说明 """
for name, member in cls.__members__.items():
if code in member.value.keys():
message = cls[name].message
return message
return None
def __repr__(self):
return "<%s.%s, %s>" % (self.__class__.__name__, self.name, self.value)
def __str__(self):
return "%s.%s" % (self.__class__.__name__, self.name)
if __name__ == "__main__":
# 获取状态码
print(APIStatusCode.SUCCESS.code)
# 获取状态码说明
print(APIStatusCode.SUCCESS.message)
# 根据状态码获取对应的说明
print(APIStatusCode.message_by_code(1))