在做一个项目之前,先分析这个项目中有多少中类,每个类中有什么属性和行为方法(函数),只有条理清晰了,编写到中间和后面也不会出现混乱状态,首先在做这个项目之前,我本人犯了一个错误,因为之前的想法是在一个类中定义一个函数,这个函数中可以调用其他模块的类和方法。从而实现界面和功能之间的联动性。后来在实际操作中,出现了很多BUG,因为本人对Python的理解和掌握不是特别的深入,希望读者看到的话,请指明我的错误的原因,在这里笔者不胜感激!错误的原因我理解为,在一个类中创建的函数,这个函数自带(self),当我在这个函数下调用其他模块中类的方法时,也需要传入一个self对象。但这个self对象是我当前类的对象,造成了编程后期的混乱,后来参考了老师的做法,思路也清晰了许多,那就是每个页面的创建的类,尽量不要相互调用。这样不利于后期的代码维护和优化!
进入正题,我们要做一个银行系统,首先分析它是有:用户类(user)、卡类(card)、管理员类(admin)、ATM类(atm实现功能)、最后一个测试函数main( )。其次考虑这些类所有的属性和行为方法等等。例如用户类的属性就是用户的姓名,身份证,手机号,卡号,等等。这里不再赘述,直接附上我用户类的代码吧:
用户类:
class Users(object):
def __init__(self, user_name, user_id, user_phone, user_card):
self.user_name = user_name
self.user_id = user_id
self.user_phone = user_phone
self.user_card = user_card
print('{}用户您好!欢迎您来我行办理业务,你的信任是我们进步的动力'.format(self.user_name))
def __str__(self):
return '尊敬的{}用户您好,您的个人身份证号:{},手机号:{}'.format(self.user_name, self.user_id, self.user_phone)
卡类:
class Cards(object):
def __init__(self, card_num, card_pwd, card_balance):
self.card_num = card_num
self.card_pwd = card_pwd
self.card_balance = card_balance
self.card_state = True # 卡 状态 为 打开状态
print('长安银行卡已办好,请您保管好您的银行卡\n')
# def print_(self):
def __str__(self):
if self.card_state == True:
return '卡状态:正常使用...\n账户:{},余额为{}元\n'.format(self.card_num, self.card_balance)
else:
return '卡状态:锁卡中。。。请先解锁\n'
管理员类:
import time
class Admin(object):
def __init__(self, admin, pwd):
self.admin = admin
self.pwd = pwd
def login(self):
print('管理员登陆界面'.center(100, '-'))
admin_name = input('请输入管理员账号:')
paswd = input('请输入管理员密码:')
if self.admin != admin_name and self.pwd != paswd:
print('管理员账户或密码错误,已退出管理系统程序')
else:
t = time.time()
at = time.localtime(t)
str1 = time.strftime('%Y/%m/%d %H:%M:%S', at)
print('欢迎管理员:%s进入西安银行管理界面!'.center(90,'-') % self.admin,
'当前时间为:%s'.rjust(103, ' ') % str1,'\n\n')
接下来是atm类,这个类是实现功能的主类,代码稍微多一点,这么写的个人感觉条理比较清晰!
import random as rd
from card import Cards
from user import Users
import time
class ATM(object):
def __init__(self):
self.userdic = {}
def inter(self):
print('欢迎来到XX银行'.center(102, '*'))
print('*', '1.开户账号'.rjust(40, ' ', ), end='\t\t\t\t\t\t')
print('2.查询账户'.ljust(35, ' '), '*'.rjust(1, '*'))
print('*', '3.账户存款'.rjust(40, ' '), end='\t\t\t\t\t\t')
print('4.账户取款'.ljust(35, ' '), '*'.rjust(1, '*'))
print('*', '5.账户转账'.rjust(40, ' '), end='\t\t\t\t\t\t')
print('6.账户改密'.ljust(35, ' '), '*'.rjust(1, '*'))
print('*', '7.锁定账户'.rjust(40, ' '), end='\t\t\t\t\t\t')
print('8.账户解锁'.ljust(35, ' '), '*'.rjust(1, '*'))
print('*', '9.用户销户'.rjust(40, ' '), end='\t\t\t\t\t\t')
print('0.退出账户'.ljust(35, ' '), '*'.rjust(1, '*'))
print('欢迎来到西安银行'.center(102, '*'))
def open_account(self):
user_name = input('请输入您的姓名:\n')
user_id = int(input('请输入您的身份证号:\n'))
user_phone = int(input('请输入您的手机号: \n'))
while True:
user_pwd = input('请设置您的密码:\n')
if len(user_pwd) < 6:
print('密码不能少于6位,请重新输入!')
else:
while True:
card_balance = int(input('请存入不少于10块的现金开户:\n'))
if card_balance < 10:
print('存入金额不能少于10元,请上交10元保护费!')
else:
card_num = rd.randint(100000, 999999)
print('开户成功您的卡号为:%d, 卡余额为:%.2f' % (card_num, card_balance))
card = Cards(card_num, user_pwd, card_balance)
card.state = True
user = Users(user_name, user_id, user_phone, card)
self.userdic[card_num] = user
return False
def index_account(self):
card_num = int(input('请输入您的卡号 \n'))
if self.userdic.get(card_num) == None:
print('该卡号不存在,请检查是否有误')
return False
else:
user = self.userdic[card_num]
if user.user_card.card_state == False:
print('该卡已锁定,请先解锁!')
else:
for i in range(3):
card_pwd = input('请输入您的密码:\n')
if card_pwd != user.user_card.card_pwd:
print('密码输入错误,请重新输入,剩余次数:{}'.format(2 - i))
else:
print(user, user.user_card)
break
else:
user.user_card.card_state = False
print('3次机会已经用完', user.user_card)
return False
return user.user_card.card_state
def verify(self, choice):
card_num = int(input('请输入您的卡号 \n'))
if self.userdic.get(card_num) == None:
print('该卡号不存在,请检查是否有误')
return False
else:
user = self.userdic[card_num]
if user.user_card.card_state == False:
print('您的卡已锁定,请先解锁!')
else:
for i in range(3):
card_pwd = input('请输入您的密码:\n')
if card_pwd != user.user_card.card_pwd:
print('密码输入错误,请重新输入,剩余次数:{}'.format(2 - i))
else:
if choice == 3: # 存款
save_money = int(input('请输入存款金额:\n'))
user.user_card.card_balance += save_money #用户属性-->卡属性-->余额 += 存入金额
print(user.user_card) # 打印 用户属性-->卡,信息
return False
elif choice == 4: # 取款
while True:
with_drwan = int(input('请输入取款金额:\n')) # 提现金额
if with_drwan > user.user_card.card_balance: # 当提现金额大于账户余额,提现失败
print('银行卡余额不足,请重新输入')
else:
user.user_card.card_balance -= with_drwan # 提现成功 情况
print('提现成功!', user.user_card)
break
return False
elif choice == 5:
while True:
card_num_another = int(input('请输入转账账户:\n')) # 转账用户
if self.userdic.get(card_num_another) == None: # 如果用户字典中没有用户的卡号,
# 那么字典的索引卡号的结果 就为空! 用此方法 可以不用 for循环去遍历字典。减少代码量
print('该卡号不存在,请检查是否有误')
else:
user_num_another = self.userdic[card_num_another]
transfer_money = int(input('请输入转账金额:'))
if transfer_money > user.user_card.card_balance: # 转账金额大于账户余额,失败
print('您的账户余额不足,请先充值您的账户余额', user.user_card)
return False
else:
user.user_card.card_balance -= transfer_money # 转账金额小于账户余额。成功
user_num_another.user_card.card_balance += transfer_money
print('转账成功,您当前的账户余额为{}'.format(user.user_card.card_balance))
break
return False
elif choice == 6:
while True:
new_pwd = input('请输入您的新密码:\n')
new_pwd1 = input('请再次输入新密码:\n')
if new_pwd != new_pwd1: # 不一致,会一直循环。
print('两次输入不一致,请重新输入新密码:\n')
else:
user.user_card.card_pwd = new_pwd # 将用户属性--->卡属性--->卡密赋新值
print('密码更改成功,新密码为{}'.format(user.user_card.card_pwd))
break
return False
elif choice == 7:
islock = input('您确定要锁定该账户吗? (y/n)')
if islock == 'y':
user_pwd = input('请输入您的密码:\n')
if user_pwd != user.user_card.card_pwd:
print('密码错误,锁定失败!')
return False
else:
user.user_card.card_state = False # 改变卡属性--->卡状态为锁定
print(user.user_card, '\n该账户已锁定。\n')
return False
elif choice == 8:
self.unlock() # 调用 解锁函数
elif choice == 9:
while True:
card_num1 = int(input('请输入您要删除的卡号:\n'))
card_pwd1 = input('请输入卡号密码:\n')
if self.userdic.get(card_num1) == None:
print('该卡号不存在,请检查是否有误')
else:
if card_pwd1 != self.userdic[card_num1].user_card.card_pwd: # 将用户输入的密码和字典中
# 之前存入的密码进行比对。用户字典中的值是用户对象,用户对象属性-->卡属性-->卡密
print('密码有误,请重新输入!')
else:
isClear = input('您确定要删除该账户吗? (y/n)')
if isClear == 'y':
time.sleep(3)
self.userdic.pop(card_num1)
print('用户已销户!欢迎再次办理我行业务!谢谢!')
return False
else:
print('已退出销户业务!')
break
return False
else:
user.user_card.card_state = False
print('3次机会已经用完', user.user_card)
return False
def unlock(self):
card_num = int(input('请输入您的银行卡号:\n'))
if self.userdic.get(card_num) == None: # 用字典的get方法来获取卡号,如果card_num(key)不存在
# 将会返回 None,如果存在则返回的 用户对象(value),如果通过self.userdic.[card_num]去索引
# card_num(key),则程序会报错,用处理异常处理 代码量会线性增加。
print('该卡号不存在,请检查是否有误')
else:
user = self.userdic[card_num] # 用一个变量来接收用户字典中卡号所对应的对象
print(user.user_card) # 打印 对象属性 的 卡属性 ,查看卡状态(True)。
unlock_ = input('是否解锁您的卡号?(y/n)')
if unlock_ == 'y':
user_name1 = input('请输入您的姓名:\n')
user_id1 = int(input('请输入您的身份证号:\n'))
user_phone1 = int(input('请输入您的手机号: \n'))
while True:
if user_name1 != user.user_name and user_id1 != user.user_id and user_phone1 != user.user_phone:
print('您的信息核实不正确!请重新输入')
else:
while True:
yzm = rd.randint(1000, 9999)
yzm_1 = int(input('验证码:{} 请输入验证码:\n'.format(yzm)))
print('请稍后...')
if yzm_1 == yzm:
time.sleep(2)
print('正在为您解除锁定,请稍后...')
user.user_card.card_state = True # 改变卡状态信息
print(user.user_card) # 打印用户卡状态信息
break
else:
print('验证码输入错误,请重新输入!')
break
else:
print('您的卡号冻结至29999年,到时候请让您的后代来解锁,谢谢支持我行的工作!')
有兴趣的朋友可以看下我的代码,帮我指出逻辑有问题的地方,或者是哪还需要优化,指正,等等。