Python3开发抽奖系统
前言
记录python3的小示例,使用python3.11.0、mypy、typehint、pipenv,项目主要用于记录最新版本python的语法特性与面向对象示例
一、需要给项目创建json文件
- user.json,默认初始为 {}
- gift.json,默认初始为 {}
二、创建实体
代码如下(示例):
from typing import Optional, Any, Union
class UserEntity(object):
"""
用户实体
"""
def __init__(self,
user_name: Optional[str],
role: Optional[str],
active: Optional[bool] = None,
create_time: Union[float | str | None] = None,
update_time: Union[float | str | None] = None,
gifts: Optional[list[str]] = None):
self.user_name = user_name
self.role = role
self.active = active
self.create_time = create_time
self.update_time = update_time
self.gifts = gifts
def __str__(self) -> str:
return f'''
UserEntity(user_name={self.user_name},role={self.role},active={self.active},create_time={self.create_time},update_time={self.update_time},gifts={self.gifts})
'''.strip()
def to_json_dict(self) -> dict[str, Any]:
"""
将python对象转换成字典
:return: dict[str, Any]
"""
return {
'username': self.user_name,
'role': self.role,
'active': self.active,
'create_time': self.create_time,
'update_time': self.update_time,
'gifts': self.gifts
}
@staticmethod
def convert2object(dict_: dict[str, Any]) -> 'UserEntity':
"""
json格式数据转换成python数据
:param dict_: key、value字典
:return: UserEntity
"""
return UserEntity(
dict_.get('username'), dict_.get('role'),
dict_.get('active'), dict_.get('create_time'),
dict_.get('update_time'), dict_.get('gifts')
)
三、创建枚举
代码如下(示例):
import enum
from typing import Optional
@enum.unique
class RoleTag(enum.Enum):
"""
角色枚举值
"""
admin = 1
normal = 2
@classmethod
def is_exist(cls, role: str) -> bool:
"""
通过字符串判断是否具备该枚举值
:param role: 字符串
:return: 是否存在, true: 存在, false: 不存在
"""
match role:
case cls.admin.name:
return True
case cls.normal.name:
return True
case _:
return False
@staticmethod
def to_tag(role: Optional[str]) -> 'RoleTag':
match role:
case 'admin':
return RoleTag.admin
case 'normal':
return RoleTag.normal
case _:
return RoleTag.normal
@enum.unique
class FirstLevelTag(enum.Enum):
level1 = 1
level2 = 2
level3 = 3
level4 = 4
@classmethod
def is_exist(cls, level: str) -> bool:
"""
通过字符串判断是否具备该枚举值
:param level: 字符串
:return: 是否存在, true: 存在, false: 不存在
"""
match level:
case cls.level1.name:
return True
case cls.level2.name:
return True
case cls.level3.name:
return True
case cls.level4.name:
return True
case _:
return False
@enum.unique
class SecondLevelTag(enum.Enum):
level1 = 1
level2 = 2
level3 = 3
@classmethod
def is_exist(cls, level: str) -> bool:
"""
通过字符串判断是否具备该枚举值
:param level: 字符串
:return: 是否存在, true: 存在, false: 不存在
"""
match level:
case cls.level1.name:
return True
case cls.level2.name:
return True
case cls.level3.name:
return True
case _:
return False
三、核心类主要负责写入文件或修改操作
代码如下(示例):
from typing import Any, Optional
from common import RoleTag, FirstLevelTag, SecondLevelTag
from dao.file_operate import UserJsonOperate, GiftJsonOperate
from entitys import UserEntity
class Base(UserJsonOperate, GiftJsonOperate):
def __init__(self, user_json: str, gift_json: str):
UserJsonOperate.__init__(self, user_json) # 多继承使用该方式可以指定调用父类的初始化函数
GiftJsonOperate.__init__(self, gift_json)
def _get_user(self, user_name: str, time_to_str: bool = False) -> Optional[UserEntity]:
"""
获取user
:param user_name: 用户名
:return: Optional[UserEntity]
"""
return UserJsonOperate._get_entity(self, user_name, time_to_str)
def _add_user(self, user: UserEntity) -> None:
"""
添加用户数据
"""
self._add_entity_base(user)
def _update_user(self, user: UserEntity) -> None:
"""
修改用户数据
"""
return self._update_entity_base(user)
def _update_user_active(self, user_name: str) -> bool:
"""
修改用户可用状态
"""
return self._update_active_base(user_name)
def _update_role(self, user_name: str, role: RoleTag) -> bool:
"""
通过用户名检查并更新角色标识
"""
return self._update_change_role_base(user_name, role)
def _del_user(self, user_name: str) -> Optional[UserEntity]:
"""
删除用户
"""
return self._del_user_base(user_name)
def _get_gifts_all(self) -> dict[str, Any]:
"""
获取礼品数据
"""
return self._get_gift_all()
def _add_gift(self, first_level: FirstLevelTag,
second_level: SecondLevelTag,
gift_name: str,
gift_count: int) -> None:
"""
添加礼品
"""
self._add_gift_base(first_level, second_level, gift_name, gift_count)
def _update_gift_count(self, first_level: FirstLevelTag,
second_level: SecondLevelTag,
gift_name: str, gift_count: int = 1) -> bool:
"""
修改礼品数量
"""
return self._update_count_base(first_level, second_level, gift_name, gift_count)
def _del_gift(self, first_level: FirstLevelTag,
second_level: SecondLevelTag,
gift_name: str) -> Optional[dict[str, Any]]:
"""
删除礼品
"""
return self._del_gift_base(first_level, second_level, gift_name)
四、项目下载
总结
该项目主要实现了抽奖系统的同时使用typehint,python对json文件读取比较简单但是转换成python对象比较繁琐,可能项目中还有继续优化的空间,typehint个人认为还不是特别完善,比如提供了Optional这种类型标注却没有将Optional转换成具体的实例的函数,使用typehint确实可以提高代码可读性,但是同时牺牲了python的那种灵活性,这就看个人取舍了,目前给我的感受是typehint既没有想静态语言的那种严谨也没有脚本语言的灵魂,当然在不牺牲性能的前提下做到这些也算能接受,多继承感觉用起来一般,可能个人还是更倾向使用严谨的语言吧,希望后续py能继续改进。