美文网首页Python
Python 枚举类

Python 枚举类

作者: Rethink | 来源:发表于2021-07-15 15:46 被阅读0次

    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))
    

    相关文章

      网友评论

        本文标题:Python 枚举类

        本文链接:https://www.haomeiwen.com/subject/twxmpltx.html