Python v3.8.5
如果想將一個(gè)類定義為枚舉類,只需要令其繼承自enum 模塊(內(nèi)置)中的 Enum 類即可。枚舉類具有以下特點(diǎn):
- 枚舉類不支持實(shí)例化;
- 成員的值不能在類的外部做任何修改,每個(gè)成員都有
name,value兩個(gè)屬性,其中name為該枚舉值的名稱,value為該枚舉值的內(nèi)容; - 定義枚舉時(shí),成員名稱不允許重復(fù),但在默認(rèn)情況下,不同的成員值允許相同,兩個(gè)相同值的成員,第二個(gè)成員的名稱將會(huì)被視作第一個(gè)成員的別名,若要限制不能定義相同值的成員。可以使用裝飾器
@unique; - 枚舉支持迭代器,可以遍歷枚舉成員;如果枚舉有值重復(fù)的成員,循環(huán)遍歷枚舉時(shí)只獲取值重復(fù)成員的第一個(gè)成員,若想把值重復(fù)的成員也遍歷出來(lái),要用枚舉的一個(gè)特殊屬性:
__members__;
在自己的web項(xiàng)目中,接口響應(yīng)狀態(tài)碼枚舉類部分代碼如下:
from enum import Enum, unique
from typing import Optional
@unique
class APIStatusCode(Enum):
"""接口響應(yīng)狀態(tài)碼枚舉類
"""
SUCCESS = {1: "Success"}
UNKNOWN_ERROR = {-1: "Unknown Error"}
PARAMETER_ERROR = {10232: "Parameter Error"}
@property
def code(self):
"""根據(jù)枚舉值取狀態(tài)碼 -> `code` """
# self is the member here
return list(self.value.keys())[0]
@property
def message(self):
"""根據(jù)枚舉值取狀態(tài)碼說(shuō)明 -> `message` """
return list(self.value.values())[0]
@classmethod
def message_by_code(cls, code) -> Optional[str]:
"""根據(jù)狀態(tài)碼獲取狀態(tài)碼說(shuō)明 """
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__":
# 獲取狀態(tài)碼
print(APIStatusCode.SUCCESS.code)
# 獲取狀態(tài)碼說(shuō)明
print(APIStatusCode.SUCCESS.message)
# 根據(jù)狀態(tài)碼獲取對(duì)應(yīng)的說(shuō)明
print(APIStatusCode.message_by_code(1))