阅读目录

  • 面向对象实现一个银行系统
    • 需求文档:
      • card 类 存储卡类
      • person 类 用户类
      • view 类 视图类
      • operation 类 操作类
      • main 调用十个功能
    • 模块基本实现
      • 需要实现的功能
      • 类型要判断 使用正则
    • 实现
      • 目录结构
      • card.py
      • user.py
      • view.py
      • operation.py
      • bank_main.py
    • 总结

面向对象实现一个银行系统

需求文档:

card 类 存储卡类
'''
卡号  ,  密码  ,    余额  ,  锁定状态
cardid    password    money    islock
'''
person 类 用户类
'''
用户名 , 身份证 , 手机号 , 卡
name , userid , phone , card
'''
view 类 视图类

登录 , 打印欢迎界面 , 打印操作界面

operation 类 操作类

将十个功能都写在操作类当中

main 调用十个功能
'''
(1)开户 : register
(2)查询 : query
(3)存钱 : save_money
(4)取钱 : get_money
(5)转账 : trans_money
(6)改密 : change_pwd
(7)锁卡 : lock
(8)解卡 : unlock
(9)补卡 : new_card
(10)退出: save往文件中存储数据:
二套数据;
user.txt => 卡号:用户 => user_dict
userid.txt => 身份证:卡号 => user_id_dict身份证 卡号 用户
'''

模块基本实现

需要实现的功能
'''
取钱:卡是否存在,是否冻结,取钱金额是否正确转账:把一个卡里的钱转到其他卡内 (卡是否存在,是否冻结,对方账户是否存在,转账的金额是否正确)改密:(1)原密码改密  (2)身份证改密解卡:判断卡号和身份证是否正确在选择解卡补卡:将旧用户的所有信息和新卡绑定(包括名字,余额等所有卡信息和用户信息,数据重新绑定)'''
类型要判断 使用正则
 姓名不能为空,密码长度6位不能空,身份证号长度18位不能为空,一个身份证号只能注册一次不能重复.不能给自己转账

实现

目录结构

card.py
class Card(object):def __init__(self, card_id, password, money):self.card_id = card_idself.password = passwordself.money = money# 默认新开的卡都不锁self.is_lock = False
user.py
class User(object):def __init__(self,name,user_id,phone,card):self.name = nameself.user_id = user_idself.phone = phoneself.card = card
view.py
import timeclass View(object):@staticmethoddef login():while True:name = input("请输入管理员账户:")pwd = input("请输入管理员密码:")if name == "admin" and pwd == "111":# 打印欢迎界面View.login_view()# 延迟一秒刷新界面time.sleep(1)# 打印操作界面View.operation_view()# 账号密码正确返回Truereturn Trueelse:print("管理员账号或密码不正确")@staticmethoddef login_view():print("*******************************************")print("*                                         *")print("*                                         *")print("*         Welcome To OldBoy Bank          *")print("*                                         *")print("*                                         *")print("*******************************************")@staticmethoddef operation_view():print("*******************************************")print("*           开户(1)    查询(2)             *")print("*           存钱(3)    取钱(4)             *")print("*           转账(5)    改密(6)             *")print("*           锁卡(7)    解卡(8)             *")print("*           补卡(9)    退出(0)             *")print("*******************************************")
operation.py
import os
import pickle
import random
from .card import Card
from .user import Userclass Operation(object):# 初始化操作dic_func = {1: 'register', 2: 'query', 3: 'save_money', 7: 'lock', 8: 'unlock', 0: 'save'}def __init__(self):# 程序进行操作时加载两套存储数据(用函数分离写法)# 第一套:卡号:用户对象self.load_user()# 第二套:身份证:卡号self.load_user_id()def load_user(self):# 判断文件是否存在,存在时候就拿数据,否则初始化空字典if os.path.exists("user.txt"):with open("user.txt", 'rb')as rf:self.user_dict = pickle.load(rf)else:self.user_dict = {}print(self.user_dict)def load_user_id(self):if os.path.exists("user_id.text"):with open("user_id.txt", "rb")as rf:self.user_id_dict = pickle.load(rf)else:self.user_id_dict = {}print(self.user_id_dict)# 保存退出操作def save(self):with open("user.txt", mode="wb") as fp:pickle.dump(self.user_dict, fp)with open("userid.txt", mode="wb") as fp:pickle.dump(self.user_id_dict, fp)# 开户操作def register(self):name = input("请输入您的姓名:")user_id = input("请输入您的身份证号:")phone = input("请输入您的手机号:")# 获取卡密码password = self.get_cwd()# 获取卡号card_id = self.get_cardid()# 余额默认10块money = 10# 创建一张新卡card = Card(card_id, password, money)# 创建一个用户user = User(name, user_id, phone, card)# 存储数据# 存储 (卡号:用户对象)# self.user_dict[card.card_id]=userself.user_dict[card_id] = user# 存储(身份证:卡号)# self.user_id_dict[user.user_id]=card_idself.user_id_dict[user_id] = card_id# 给出提示print("恭喜{}开卡成功,您的卡号为:{},卡内余额{}元".format(name, card_id, money))# 获取密码def get_cwd(self):while True:pwd1 = input("请输入您的密码:")pwd2 = input("请确认您的密码:")if pwd1 == pwd2:return pwd1  # 返回给上面的passwordelse:print("两次密码不一致,请重新输入")# 获取卡号def get_cardid(self):card_id = ""for i in range(6):card_id += str(random.randrange(0, 10))if card_id not in self.user_dict:return card_id#  查询操作def query(self):  # 查询# 先获取到一张卡# 获取卡信息card = self.get_card_info()# card 要么返回False  要么返回真实对象if not card:print("对不起,你的卡不存在")else:# 判断卡是否锁定if card.is_lock:  # islock=Trueprint("对不起,您的卡被锁了")else:# 检查卡密码if self.check_cwd(card):print("你的卡内余额是{}元".format(card.money))# 获取卡信息def get_card_info(self):card_id = input("请输入您的卡号")if card_id not in self.user_dict:print("您的卡不存在")else:  # 获取用户对象# 通过: 卡号:用户对象 取到对象user = self.user_dict[card_id]# 拿到 封装在用户类中的卡对象return user.card# 检查卡密码def check_cwd(self, card):count = 1while count < 4:pwd = input("请输入您的密码")if pwd == card.password:return Trueelse:# 剩余次数 = 总次数-已经循环的次数print("密码错误,您还剩下%d次机会" % (3 - count))# 等于三次,直接锁卡if count == 3:card.is_lock = Trueprint("抱歉,因为密码错了三次,你的卡被锁了")count += 1# 存钱操作def save_money(self):card = self.get_card_info()if not card:print("抱歉,你的卡不存在!")else:# 获取用户对象user = self.user_dict[card.card_id]  # 卡号:用户对象 表print("您的卡用户名:%s" % (user.name))key_sure = input("确认存款请按 1 ,任意按键回上一层!")if key_sure == "1":str_money = input("请输入您的存款金额:")if str_money.isdecimal():money = int(str_money)# 充值card.money += moneyprint("成功存入%s元" % (money))else:print("你输入的金额有误!")# 锁卡操作def lock(self):card = self.get_card_info()if not card:print("抱歉,您的卡不存在")else:num = input("1.使用密码冻结  2.使用身份证冻结")if num == "1":if self.check_cwd(card):card.is_lock = Trueprint("======锁卡成功======")elif num == "2":user_id = input("请输入您的身份证号:")user = self.user_dict[card.card_id]if user_id == user.user_id:card.is_lock = Trueprint("======锁卡成功======")else:print("======锁卡失败======")# 解卡操作def unlock(self):card = self.get_card_info()if not card:print("抱歉,您的卡不存在")else:while True:user_id = input("请输入您的身份证号:")user = self.user_dict[card.card_id]if user_id != user.user_id:print('您输入的身份证有误,请重新输入!')breakelse:if self.check_cwd(card):card.is_lock = Falseprint("======解卡成功======")return
bank_main.py
from Bank.view import View
from Bank.operation import Operationclass Main():@staticmethoddef run():if View.login():obj = Operation()while True:choice = input("请选选择需要办理的业务:")# 用反射来实现get_func = Operation.dic_func[int(choice)]var = getattr(obj, get_func)if get_func=='save':var()breakelse:var()# 卡户# if choice == "1":#     obj.register()# # 查询# elif choice == "2":#     obj.query()# # 存钱# elif choice == "3":#     obj.save_money()# elif choice == "4":#     print(4)# elif choice == "5":#     print(5)# elif choice == "6":#     print(6)# # 锁卡# elif choice == "7":#     obj.lock()# # 解卡# elif choice == "8":#     obj.unlock()# elif choice == "9":#     print(9)# # 退出保存# elif choice == "0":#     obj.save()#     breakif __name__ == '__main__':Main.run()

总结

这个阶段没有用到数据库,主要练习一下如何连接起:不同类、代码架构,
以及可以使用“反射”!

# 小彩蛋
'''
这是我写的第一篇文章,开始连markdown编辑器都不会用,
而且你可以看到上面,标题乱加,排版不好看,内容总结也不到位;
我是10月31号又回来修改了一次,后面我其他文章写的就逐渐变好了!
感慨一下:当初有想整理知识、写文章的念头,开始总是感觉难,但只要你迈出了第一步,总会变得得心应手!
写于:2019.10.31
'''

面向对象 编写 银行系统 实战相关推荐

  1. python 银行工作_Python:银行系统实战(一)

    最近突然抽筋想做一下大学时候做过的银行系统实战~ 代码就发在这里啦~ 学弟学妹们请查收~ 不过是python版本的,你们也用不上... 两个py文件,一个是后台系统处理的,一个是总控py 文件如下: ...

  2. 每日一题.PYTHON面向对象编写模拟人生屌丝逆袭游戏(登录类/角色类/场景类)?

    文件结构: [root@xmdevops xmdevops_limanman]# tree |grep -v ".pyc" |-- main.py                 ...

  3. 面向对象软件开发实战

    http://www.cnblogs.com/linhaifeng/articles/7341318.html#_label4   面向对象实战

  4. (OJ)Java面向对象-编写汽车类

    编写汽车类 Problem Description 1.实验目的(1) 熟悉类的创建方法(2) 掌握对象的声明与创建(3) 能利用面向对象的思想解决一般问题2.实验内容 编写一个java程序,设计一个 ...

  5. python 商城api编写_Python实战-编写Web App-Day8-编写API

    原标题:Python实战-编写Web App-Day8-编写API API就是把Web App的功能全部封装了,所以,通过API操作数据,可以极大地把前端和后端的代码隔离,使得后端代码易于测试,前端代 ...

  6. php面向对象编写计算器,使用面向对象的图形计算器

    这个例子可能并不实用,但基本概括了面向对象的三个特征:继承性,封装性,多态性.本例的主要功能有:让用户可以选择不同类型的图形: 对所选的图形输入其相关属性: 根据输入的属性计算该图形的周长和面积. 效 ...

  7. php面向对象编写计算器,使用面向对象的图形计算器,面向对象图形计算器_PHP教程...

    使用面向对象的图形计算器,面向对象图形计算器 这个例子可能并不实用,但基本概括了面向对象的三个特征:继承性,封装性,多态性.本例的主要功能有: 效果如下: 思路: 需要改进的地方: index.php ...

  8. 软件测试中的面向对象测试,面向对象编写测试用例

    前言 测试用例和测试点是相辅相成的,测试点是属于思路性质的,测试用例是属于在实际的工作中具体怎么进行测试的一个依据.一般情况下,用例编写时,我建议把用例中有公用的部分,提取出来写到一块,有特性的部分, ...

  9. MATLAB编写界面实战-一款优良的二维非结构化网格生成软件

    主核调用c语言编写的delaucy非结构化网格生成器,采用Matlab编写界面,界面代码如下: %--------------------------------------------------- ...

最新文章

  1. OpenERP里面继承的用法
  2. 用于部分迁移学习的加权对抗网络 | CVPR 2018论文解读
  3. php实现二叉搜索树,二叉搜索树有几种实现方式
  4. 牛客网知识点总结(二
  5. 【Flink】Flink 1.13 将数据 写入 到 elasticsearch 7 案例
  6. 95-40-150-java.util.concurrent-ExecutorCompletionService
  7. Thrift-java实例
  8. 有关mysql的清理与优化_mysql优化点整理
  9. C#遍历DataSet数据的几种方法总结
  10. Python.Algorithms(2nd)pdf
  11. SRS之SrsRtmpConn::publishing详解
  12. Spring与策略模式
  13. java 渲染器_用Java实现一个光线追踪渲染器(下)
  14. Oracle JDE 系统架构总结..
  15. MYSQL--主键 外键
  16. java标点符号用什么意思_标点符号的使用我说他说XX说后面在什么情况下加逗号、冒号、冒号双引号、双引号或者逗号双引号等的区分问题请详细说明谢谢...
  17. 4个角度教你选小程序开发工具?
  18. minigui[基础篇][11]—— 图标
  19. 无需建网站,不用发帖,持续获取搜索引擎流量的方法(灰白项目皆可)
  20. Spring框架学习 思维导图

热门文章

  1. 【财务_会计1_1】会计概念和目标
  2. windows编程如何更改窗口图标和光标
  3. Matlab求矩阵的Jordan标准形
  4. TextView 多行文字末尾添加图片
  5. ios开发 把视频文件和图片保存到相册
  6. 博人传:火影迷青春的证明和延续
  7. nextcloud云搭建及教程转接
  8. 电商平台投诉,都适用哪些场景
  9. E5 调用API续订程序:Microsoft 365 E5 Renew
  10. 大数据和云计算技术周报(第182期)