Python3开发抽奖系统


前言

记录python3的小示例,使用python3.11.0、mypy、typehint、pipenv,项目主要用于记录最新版本python的语法特性与面向对象示例


一、需要给项目创建json文件

  1. user.json,默认初始为 {}
  2. 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能继续改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值