项目中需要大量用到枚举变量,但我们希望可以根据指定的字符串,创建对应的枚举变量,并将枚举值作为存储值
场景:客户端发送的消息包带有"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.基类中封装常用的方法