学习python基础后的第一个小型项目bank_atm

       在做一个项目之前,先分析这个项目中有多少中类,每个类中有什么属性和行为方法(函数),只有条理清晰了,编写到中间和后面也不会出现混乱状态,首先在做这个项目之前,我本人犯了一个错误,因为之前的想法是在一个类中定义一个函数,这个函数中可以调用其他模块的类和方法。从而实现界面和功能之间的联动性。后来在实际操作中,出现了很多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年,到时候请让您的后代来解锁,谢谢支持我行的工作!')
有兴趣的朋友可以看下我的代码,帮我指出逻辑有问题的地方,或者是哪还需要优化,指正,等等。

你可能感兴趣的:(Python课程总结)