Python

Python 枚举类

2021-07-15  本文已影响0人  Rethink

Python v3.8.5

如果想将一个类定义为枚举类,只需要令其继承自enum 模块(内置)中的 Enum 类即可。枚举类具有以下特点:

  1. 枚举类不支持实例化;
  2. 成员的值不能在类的外部做任何修改,每个成员都有name,value两个属性,其中name为该枚举值的名称,value为该枚举值的内容;
  3. 定义枚举时,成员名称不允许重复,但在默认情况下,不同的成员值允许相同,两个相同值的成员,第二个成员的名称将会被视作第一个成员的别名,若要限制不能定义相同值的成员。可以使用装饰器@unique
  4. 枚举支持迭代器,可以遍历枚举成员;如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员,若想把值重复的成员也遍历出来,要用枚举的一个特殊属性:__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))
上一篇下一篇

猜你喜欢

热点阅读