首页 > 其他分享 >面向对象高级实战演练之银行系统

面向对象高级实战演练之银行系统

时间:2024-03-30 15:56:24浏览次数:17  
标签:实战 account money self 演练 面向对象 print input id

功能说明:

1 - 银行管理员(使用管理员密码)查看所有用户信息
2 - 进入银行系统提示功能
3 - 用户密码管理
4 - 账户开户/销户
5 - 存款/取款
6 - 用户间转账
7 - 用户余额查询
8 - 常见错误检查和提示

代码实现:

import random
import string


class Account(object):

    def __init__(self, name, password, money):
        self.user_id = self.__get_random_char(6)
        self.name = name
        self.password = password
        self.money = money

        print(f"""
         成功创建账户! 
        【账户ID】: {self.user_id}
        【账户名】:  {self.name}
        【账户余额】: {self.money}
        """)

    @staticmethod
    def __get_random_char(num):
        all_str = string.ascii_uppercase + string.digits
        str_list = random.choices(all_str, k=num)
        return "".join(str_list)


class Bank:

    def __init__(self, name, admin_pwd):
        self.name = name
        self.admin_pwd = admin_pwd

        self.accounts = dict()
        self.api_map = None

    def add_order_set(self, api_map):
        setattr(self, "api_map", api_map)
        self.query_support_func(custom=True)

    def api(self, input_order):
        if not isinstance(self.api_map, dict):
            print("请先添加接口指令集!")
            return
        func_tuple = self.api_map.get(input_order)
        if func_tuple:
            func_tuple[0]()
        else:
            print(f"指令 {input_order} 暂未收录, 请在先在接口指令集中添加指令!")

    def checkout_account_by_id(self, account_id=None, *args):
        if account_id in self.accounts:
            return self.accounts[account_id]
        else:
            print(f"未查询到该账号在本银行的账户信息!请先开户或重新确认银行账号!")
            return None

    def check_pwd_correct_by_AccountID(self, account_id=None, input_num=3, *args):
        account_id = account_id or input("请输入账户ID: ")
        account = self.checkout_account_by_id(account_id)

        for _ in range(input_num):
            pwd = input("请输入操作密码: ")
            if account.password == pwd:
                return True
            else:
                print(f"账户 {account.user_id} 密码输出错误, 请重新输入!")

        else:
            print("密码输入错误超过尝试次数!")
            return False

    def query_all_user(self, input_num=2, *args):
        for _ in range(input_num):
            pwd = input("请输入管理员密码: ")
            if self.admin_pwd == pwd:
                print(f"共计 {len(self.accounts)} 名用户;名单如下: ")
                for index, account in enumerate(self.accounts.values()):
                    print(f"{index + 1} >>【账户ID】: {account.user_id}  【账户名】: {account.name}  【账户余额】: {account.money}")
                return
            else:
                print(f"密码输出错误, 请重新输入!")

        else:
            print("密码输入错误超过尝试次数!")

    def query_support_func(self, custom=False, *args):
        if not custom:
            print(f"""
                ===== 欢迎进入【{self.name}银行】系统 =====
                【本银行支持以下业务】:
                    <查询可办理的业务>
                    <查询余额>
                    <存取款>
                    <转账>
                    <账户开户>
                    <账户销户>
            """)
        elif custom and isinstance(self.api_map, dict):
            menu_str = f"""
            ===== 欢迎进入【{self.name}银行】系统 =====
            <本银行支持以下业务>:

            【指令】\t\t=>\t\t【功能说明】
            """
            for custom_order, func_tuple in self.api_map.items():
                if isinstance(custom_order, (int, str)) and len(func_tuple) == 2 and isinstance(func_tuple[1], str):
                    menu_str += f"""{custom_order}\t\t=>\t\t"{func_tuple[1]}"\n\t\t\t"""
                else:
                    print("""
                    自定义指令集格式错误,请按如下格式设置指令集:
                        {
                            操作指令1:(功能函数1, 功能描述1),
                            操作指令2:(功能函数2, 功能描述2),
                            .....
                        }
                    """"")
            print(menu_str)
        else:
            print("自定义指令集格式错误")

    def query_money(self, account_id=None, *args):
        print("\n-------------------【正在查询】-------------------")
        account_id = account_id or input("请输入查询账户ID: ")
        account = self.checkout_account_by_id(account_id)

        if not account or not self.check_pwd_correct_by_AccountID(account_id):
            return

        print(f"""
                【账户ID】: {account.user_id}
                【账户名】:  {account.name}
                【账户余额】: {account.money}
                """)

    def add_money(self, account_id=None, a_money=None, *args):
        print("\n-------------------【正在存入】-------------------")
        account_id = account_id or input("请输入存入账户ID: ")
        account = self.checkout_account_by_id(account_id)

        if not account:
            return

        money = a_money or float(input("请输入存款金额: "))
        account.money += money
        print(f"用户 {account.name} 名下账户【{account_id}】成功存入 {money} 元,【账户余额】:{account.money}")
        return money

    def reduce_money(self, account_id=None, r_money=None, *args):
        print("\n-------------------【正在支取】-------------------")
        account_id = account_id or input("请输入支取账户ID: ")
        account = self.checkout_account_by_id(account_id)
        money = r_money or float(input("请输入支取金额: "))

        if not account or not self.check_pwd_correct_by_AccountID(account_id):
            return

        if account.money < money:
            print("账户余额不足!")
            return

        account.money -= money
        print(f"用户 {account.name} 账户【{account_id}】成功支取 {money} 元,【账户余额】:{account.money}")
        return money

    def transfer_money(self, *args):
        print("\n-------------------【转账中..... 】-------------------")
        transfer_out_account_id = input("请输入金额转出账户ID: ")
        transfer_out_account = self.checkout_account_by_id(transfer_out_account_id)
        if not transfer_out_account:
            return

        transfer_in_account_id = input("请输入金额转入账户ID: ")
        transfer_in_account = self.checkout_account_by_id(transfer_in_account_id)
        if not transfer_in_account:
            return

        money = self.reduce_money(transfer_out_account_id)
        if money is not None:
            self.add_money(transfer_in_account_id, money)

    def create_account(self, *args):
        name = input("请输入账户名: ")
        password = input("请输入账户密码: ")
        account = Account(name, password, money=0)
        self.accounts[account.user_id] = account
        return account

    def del_account(self, *args):
        account_id = input("请输入账户ID: ")
        account = self.checkout_account_by_id(account_id)

        if not account or not self.check_pwd_correct_by_AccountID(account_id):
            return

        if account.money != 0:
            print("账户余额不为0,请先取出余额以后再操作!")
            return

        self.accounts.pop(account_id)
        print(f"账户【{account_id}】成功销户")
        return True


def custom():
    print("这里是自定义功能函数!")


kylin = Bank("麒麟", "999999")
func_map = {
        # 操作指令:(功能函数, 功能描述)
        "admin": (kylin.query_all_user, "管理员操作"),
        "业务办理": (kylin.query_support_func, "查询可办理的业务"),
        "余额查询": (kylin.query_money, "查询余额"),
        "存款": (kylin.add_money, "存款"),
        "取款": (kylin.reduce_money, "取款"),
        "转账": (kylin.transfer_money, "转账"),
        "开户": (kylin.create_account, "账户开户"),
        "销户": (kylin.del_account, "账户销户"),
        "其他业务": (custom, "其他业务办理"),
    }
kylin.add_order_set(func_map)
while True:
    order = input("请选择您需要办理的业务: ")
    kylin.api(order)

效果展示:


标签:实战,account,money,self,演练,面向对象,print,input,id
From: https://www.cnblogs.com/cs-songbai/p/18105603

相关文章

  • Vue+OpenLayers7入门到实战:OpenLayers涂鸦手绘线条、圆形和多边形,涂鸦线条自动收尾连
    返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战前言本章介绍如何使用OpenLayers7在地图上进行绘制图形的功能,上一章中《Vue+OpenLayers7入门到实战:OpenLayers图形绘制功能,OpenLayers实现在地图上绘制线段、圆形和多边形》我们已经讲过多种图形的绘制,本章主要......
  • python面向对象封装,私有变量
    一、私有变量“_”单下划线开头的变量:_var ,表示这些函数和变量是元素私有的或内部使用的,为非强制性(实际可修改也可引用)。"__"双下划线开头的变量:__var,表示这些函数和变量是元素私有的或内部使用的,为强制性,对象外不可修改或引用。单下划线例子classPeople():def__ini......
  • Kubernetes超详细教程,一篇文章帮助你从零开始学习k8s,从入门到实战
    k8s概述k8sgithub地址:https://github.com/kubernetes/kubernetes官方文档:https://kubernetes.io/zh-cn/docs/home/k8s,全程是kubernetes,这个名字源于希腊语,意为"舵手"或"飞行员”k8s这个缩写是因为k和s之间有八个字符Google在2014年开源了k8s项目,k8s是一个......
  • MyDumper实战分享
    一、前言说起MySQL的逻辑备份,一般大家用的最多的是mysqldump,MySQL官方提供的逻辑导出的工具,简单易用,可以产生一致性备份。但是mysqldump只能单线程导出,导出速度有限。为了提升逻辑备份速度,MySQL官方推出了mysqlpump,支持多线程导出,一定程度上提升了导出速度。但是,mysqlpump只支持......
  • 深入探讨Docker in Docker:原理与实战指南
    在软件开发和部署中,容器化技术已经成为一个不可或缺的工具。而在使用Docker进行容器化时,有时可能会遇到需要在一个Docker容器中运行另一个Docker容器的情况,这就是所谓的"DockerinDocker"(简称DinD)。本文将深入探讨DockerinDocker的原理和实战指南,帮助读者更好地理解和应......
  • 图像分类实战:深度学习在CIFAR-10数据集上的应用
    1.前言        图像分类是计算机视觉领域的一个核心任务,算法能够自动识别图像中的物体或场景,并将其归类到预定义的类别中。近年来,深度学习技术的发展极大地推动了图像分类领域的进步。CIFAR-10数据集作为计算机视觉领域的一个经典小型数据集,为研究者提供了一个理想的......
  • 原创开发flutter3+getX仿抖音App短视频+直播实战
    前几天有分享一篇flutter3.19+dart3.3+getx实战开发抖音app短视频直播项目,得到了很多开发者的关注,这次就来分享下这个项目的视频讲解演示,希望有更多的小伙伴能喜欢~flutter3-douyin仿抖音app短视频直播flutter3.x_douyin跨平台仿抖音app实战开发flutter3+bitsdojo_w......
  • R语言paste函数、paste0函数将多个输入组合成字符串实战
    R语言paste函数、paste0函数将多个输入组合成字符串实战目录R语言paste函数、paste0函数将多个输入组合成字符串实战#基本语法......
  • R语言dplyr包near函数查看向量对应元素是否相同或者相近实战
    R语言dplyr包near函数查看向量对应元素是否相同或者相近实战目录R语言dplyr包near函数查看向量对应元素是否相同或者相近实战#......
  • .NET分布式Orleans - 8 - 贪吃蛇项目实战(准备阶段)
    到目前为止,Orleans7的核心概念基本已经学完,我准备使用Orleans7做一个项目实战,来总结自己的学习效果。项目效果通过Orleans7来完成一个贪吃蛇游戏,要求如下:可以多人在线玩贪吃蛇可以上/下/左/右改方向贪吃蛇吃完食物,身体长度+1项目暂定架构初步设想,此游戏包括一个Orleans7......