項目中需要大量用到枚舉變量,但我們希望可以根據指定的字符串,創建對應的枚舉變量,並將枚舉值作爲存儲值
場景:客戶端發送的消息包帶有"android"字符串,用以說明當前移動端系統類型,服務器端需要爲其創建對應的枚舉變量,最終將枚舉值(0或1)存入數據庫中
定義一個抽象的枚舉類作爲父類:
class BaseTupleEnum(Enum):
def __init__(self, desc, val):
self.desc = desc
self.val = val
def get_desc(self):
return self.desc
def get_value(self):
return self.val
@classmethod
def get_values(cls):
values = []
for attr in cls:
values.append(attr.value[1])
return values
@classmethod
def get_descs(cls):
descs = []
for attr in cls:
descs.append(attr.value[0])
return descs
父類的init方法可以看出,每個BaseTupleEnum枚舉類型,包含desc和val兩個屬性,desc爲我們要描述的字符串,val爲該枚舉變量對應的枚舉值
定義具體的枚舉類型:
class OsTypeEnum(BaseTupleEnum):
ANDROID = ("android", 0)
IOS = ("ios", 1)
測試用例:
class TestBaseEnum(unittest.TestCase):
def test_values(self):
expected =frozenset((OsTypeEnum.IOS.get_value(),OsTypeEnum.ANDROID.get_value()))
actual = frozenset(OsTypeEnum.values())
print (OsTypeEnum.values())
self.assertSetEqual(expected, actual)
def test_value_in(self):
value = 1
self.assertTrue(value in OsTypeEnum.values())
def test_value_equal(self):
value = 1
self.assertTrue(value == OsTypeEnum.IOS.get_value())
if __name__ == '__main__':
test = TestBaseEnum()
test.test_values()
test.test_value_in()
test.test_value_equal()
print ("<----------------->")
print (OsTypeEnum.IOS.get_desc())
print (OsTypeEnum.IOS.get_value())
特殊枚舉類型小結:
1.定義適用的枚舉類型基類
2.繼承基類,定義具體的子類
3.基類中封裝常用的方法