面向对象 编写 银行系统 实战
阅读目录
- 面向对象实现一个银行系统
- 需求文档:
- 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
'''
面向对象 编写 银行系统 实战相关推荐
- python 银行工作_Python:银行系统实战(一)
最近突然抽筋想做一下大学时候做过的银行系统实战~ 代码就发在这里啦~ 学弟学妹们请查收~ 不过是python版本的,你们也用不上... 两个py文件,一个是后台系统处理的,一个是总控py 文件如下: ...
- 每日一题.PYTHON面向对象编写模拟人生屌丝逆袭游戏(登录类/角色类/场景类)?
文件结构: [root@xmdevops xmdevops_limanman]# tree |grep -v ".pyc" |-- main.py ...
- 面向对象软件开发实战
http://www.cnblogs.com/linhaifeng/articles/7341318.html#_label4 面向对象实战
- (OJ)Java面向对象-编写汽车类
编写汽车类 Problem Description 1.实验目的(1) 熟悉类的创建方法(2) 掌握对象的声明与创建(3) 能利用面向对象的思想解决一般问题2.实验内容 编写一个java程序,设计一个 ...
- python 商城api编写_Python实战-编写Web App-Day8-编写API
原标题:Python实战-编写Web App-Day8-编写API API就是把Web App的功能全部封装了,所以,通过API操作数据,可以极大地把前端和后端的代码隔离,使得后端代码易于测试,前端代 ...
- php面向对象编写计算器,使用面向对象的图形计算器
这个例子可能并不实用,但基本概括了面向对象的三个特征:继承性,封装性,多态性.本例的主要功能有:让用户可以选择不同类型的图形: 对所选的图形输入其相关属性: 根据输入的属性计算该图形的周长和面积. 效 ...
- php面向对象编写计算器,使用面向对象的图形计算器,面向对象图形计算器_PHP教程...
使用面向对象的图形计算器,面向对象图形计算器 这个例子可能并不实用,但基本概括了面向对象的三个特征:继承性,封装性,多态性.本例的主要功能有: 效果如下: 思路: 需要改进的地方: index.php ...
- 软件测试中的面向对象测试,面向对象编写测试用例
前言 测试用例和测试点是相辅相成的,测试点是属于思路性质的,测试用例是属于在实际的工作中具体怎么进行测试的一个依据.一般情况下,用例编写时,我建议把用例中有公用的部分,提取出来写到一块,有特性的部分, ...
- MATLAB编写界面实战-一款优良的二维非结构化网格生成软件
主核调用c语言编写的delaucy非结构化网格生成器,采用Matlab编写界面,界面代码如下: %--------------------------------------------------- ...
最新文章
- OpenERP里面继承的用法
- 用于部分迁移学习的加权对抗网络 | CVPR 2018论文解读
- php实现二叉搜索树,二叉搜索树有几种实现方式
- 牛客网知识点总结(二
- 【Flink】Flink 1.13 将数据 写入 到 elasticsearch 7 案例
- 95-40-150-java.util.concurrent-ExecutorCompletionService
- Thrift-java实例
- 有关mysql的清理与优化_mysql优化点整理
- C#遍历DataSet数据的几种方法总结
- Python.Algorithms(2nd)pdf
- SRS之SrsRtmpConn::publishing详解
- Spring与策略模式
- java 渲染器_用Java实现一个光线追踪渲染器(下)
- Oracle JDE 系统架构总结..
- MYSQL--主键 外键
- java标点符号用什么意思_标点符号的使用我说他说XX说后面在什么情况下加逗号、冒号、冒号双引号、双引号或者逗号双引号等的区分问题请详细说明谢谢...
- 4个角度教你选小程序开发工具?
- minigui[基础篇][11]—— 图标
- 无需建网站,不用发帖,持续获取搜索引擎流量的方法(灰白项目皆可)
- Spring框架学习 思维导图