翼度科技»论坛 编程开发 python 查看内容

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

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
功能说明:
  1. 1 - 银行管理员(使用管理员密码)查看所有用户信息
  2. 2 - 进入银行系统提示功能
  3. 3 - 用户密码管理
  4. 4 - 账户开户/销户
  5. 5 - 存款/取款
  6. 6 - 用户间转账
  7. 7 - 用户余额查询
  8. 8 - 常见错误检查和提示
复制代码
代码实现:
  1. import random
  2. import string
  3. class Account(object):
  4.     def __init__(self, name, password, money):
  5.         self.user_id = self.__get_random_char(6)
  6.         self.name = name
  7.         self.password = password
  8.         self.money = money
  9.         print(f"""
  10.          成功创建账户!
  11.         【账户ID】: {self.user_id}
  12.         【账户名】:  {self.name}
  13.         【账户余额】: {self.money}
  14.         """)
  15.     @staticmethod
  16.     def __get_random_char(num):
  17.         all_str = string.ascii_uppercase + string.digits
  18.         str_list = random.choices(all_str, k=num)
  19.         return "".join(str_list)
  20. class Bank:
  21.     def __init__(self, name, admin_pwd):
  22.         self.name = name
  23.         self.admin_pwd = admin_pwd
  24.         self.accounts = dict()
  25.         self.api_map = None
  26.     def add_order_set(self, api_map):
  27.         setattr(self, "api_map", api_map)
  28.         self.query_support_func(custom=True)
  29.     def api(self, input_order):
  30.         if not isinstance(self.api_map, dict):
  31.             print("请先添加接口指令集!")
  32.             return
  33.         func_tuple = self.api_map.get(input_order)
  34.         if func_tuple:
  35.             func_tuple[0]()
  36.         else:
  37.             print(f"指令 {input_order} 暂未收录, 请在先在接口指令集中添加指令!")
  38.     def checkout_account_by_id(self, account_id=None, *args):
  39.         if account_id in self.accounts:
  40.             return self.accounts[account_id]
  41.         else:
  42.             print(f"未查询到该账号在本银行的账户信息!请先开户或重新确认银行账号!")
  43.             return None
  44.     def check_pwd_correct_by_AccountID(self, account_id=None, input_num=3, *args):
  45.         account_id = account_id or input("请输入账户ID: ")
  46.         account = self.checkout_account_by_id(account_id)
  47.         for _ in range(input_num):
  48.             pwd = input("请输入操作密码: ")
  49.             if account.password == pwd:
  50.                 return True
  51.             else:
  52.                 print(f"账户 {account.user_id} 密码输出错误, 请重新输入!")
  53.         else:
  54.             print("密码输入错误超过尝试次数!")
  55.             return False
  56.     def query_all_user(self, input_num=2, *args):
  57.         for _ in range(input_num):
  58.             pwd = input("请输入管理员密码: ")
  59.             if self.admin_pwd == pwd:
  60.                 print(f"共计 {len(self.accounts)} 名用户;名单如下: ")
  61.                 for index, account in enumerate(self.accounts.values()):
  62.                     print(f"{index + 1} >>【账户ID】: {account.user_id}  【账户名】: {account.name}  【账户余额】: {account.money}")
  63.                 return
  64.             else:
  65.                 print(f"密码输出错误, 请重新输入!")
  66.         else:
  67.             print("密码输入错误超过尝试次数!")
  68.     def query_support_func(self, custom=False, *args):
  69.         if not custom:
  70.             print(f"""
  71.                 ===== 欢迎进入【{self.name}银行】系统 =====
  72.                 【本银行支持以下业务】:
  73.                     <查询可办理的业务>
  74.                     <查询余额>
  75.                     <存取款>
  76.                     <转账>
  77.                     <账户开户>
  78.                     <账户销户>
  79.             """)
  80.         elif custom and isinstance(self.api_map, dict):
  81.             menu_str = f"""
  82.             ===== 欢迎进入【{self.name}银行】系统 =====
  83.             <本银行支持以下业务>:
  84.             【指令】\t\t=>\t\t【功能说明】
  85.             """
  86.             for custom_order, func_tuple in self.api_map.items():
  87.                 if isinstance(custom_order, (int, str)) and len(func_tuple) == 2 and isinstance(func_tuple[1], str):
  88.                     menu_str += f"""{custom_order}\t\t=>\t\t"{func_tuple[1]}"\n\t\t\t"""
  89.                 else:
  90.                     print("""
  91.                     自定义指令集格式错误,请按如下格式设置指令集:
  92.                         {
  93.                             操作指令1:(功能函数1, 功能描述1),
  94.                             操作指令2:(功能函数2, 功能描述2),
  95.                             .....
  96.                         }
  97.                     """"")
  98.             print(menu_str)
  99.         else:
  100.             print("自定义指令集格式错误")
  101.     def query_money(self, account_id=None, *args):
  102.         print("\n-------------------【正在查询】-------------------")
  103.         account_id = account_id or input("请输入查询账户ID: ")
  104.         account = self.checkout_account_by_id(account_id)
  105.         if not account or not self.check_pwd_correct_by_AccountID(account_id):
  106.             return
  107.         print(f"""
  108.                 【账户ID】: {account.user_id}
  109.                 【账户名】:  {account.name}
  110.                 【账户余额】: {account.money}
  111.                 """)
  112.     def add_money(self, account_id=None, a_money=None, *args):
  113.         print("\n-------------------【正在存入】-------------------")
  114.         account_id = account_id or input("请输入存入账户ID: ")
  115.         account = self.checkout_account_by_id(account_id)
  116.         if not account:
  117.             return
  118.         money = a_money or float(input("请输入存款金额: "))
  119.         account.money += money
  120.         print(f"用户 {account.name} 名下账户【{account_id}】成功存入 {money} 元,【账户余额】:{account.money}")
  121.         return money
  122.     def reduce_money(self, account_id=None, r_money=None, *args):
  123.         print("\n-------------------【正在支取】-------------------")
  124.         account_id = account_id or input("请输入支取账户ID: ")
  125.         account = self.checkout_account_by_id(account_id)
  126.         money = r_money or float(input("请输入支取金额: "))
  127.         if not account or not self.check_pwd_correct_by_AccountID(account_id):
  128.             return
  129.         if account.money < money:
  130.             print("账户余额不足!")
  131.             return
  132.         account.money -= money
  133.         print(f"用户 {account.name} 账户【{account_id}】成功支取 {money} 元,【账户余额】:{account.money}")
  134.         return money
  135.     def transfer_money(self, *args):
  136.         print("\n-------------------【转账中..... 】-------------------")
  137.         transfer_out_account_id = input("请输入金额转出账户ID: ")
  138.         transfer_out_account = self.checkout_account_by_id(transfer_out_account_id)
  139.         if not transfer_out_account:
  140.             return
  141.         transfer_in_account_id = input("请输入金额转入账户ID: ")
  142.         transfer_in_account = self.checkout_account_by_id(transfer_in_account_id)
  143.         if not transfer_in_account:
  144.             return
  145.         money = self.reduce_money(transfer_out_account_id)
  146.         if money is not None:
  147.             self.add_money(transfer_in_account_id, money)
  148.     def create_account(self, *args):
  149.         name = input("请输入账户名: ")
  150.         password = input("请输入账户密码: ")
  151.         account = Account(name, password, money=0)
  152.         self.accounts[account.user_id] = account
  153.         return account
  154.     def del_account(self, *args):
  155.         account_id = input("请输入账户ID: ")
  156.         account = self.checkout_account_by_id(account_id)
  157.         if not account or not self.check_pwd_correct_by_AccountID(account_id):
  158.             return
  159.         if account.money != 0:
  160.             print("账户余额不为0,请先取出余额以后再操作!")
  161.             return
  162.         self.accounts.pop(account_id)
  163.         print(f"账户【{account_id}】成功销户")
  164.         return True
  165. def custom():
  166.     print("这里是自定义功能函数!")
  167. kylin = Bank("麒麟", "999999")
  168. func_map = {
  169.         # 操作指令:(功能函数, 功能描述)
  170.         "admin": (kylin.query_all_user, "管理员操作"),
  171.         "业务办理": (kylin.query_support_func, "查询可办理的业务"),
  172.         "余额查询": (kylin.query_money, "查询余额"),
  173.         "存款": (kylin.add_money, "存款"),
  174.         "取款": (kylin.reduce_money, "取款"),
  175.         "转账": (kylin.transfer_money, "转账"),
  176.         "开户": (kylin.create_account, "账户开户"),
  177.         "销户": (kylin.del_account, "账户销户"),
  178.         "其他业务": (custom, "其他业务办理"),
  179.     }
  180. kylin.add_order_set(func_map)
  181. while True:
  182.     order = input("请选择您需要办理的业务: ")
  183.     kylin.api(order)
复制代码
效果展示:




来源:https://www.cnblogs.com/cs-songbai/p/18105603
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具