目录
一、题目描述
二、分析
三、源码
一、题目描述
定义表示银行卡和ATM(自动柜员机)的类,要求ATM可以实现读卡、存钱、取钱、转账的功能。
二、分析
1、首先根据题目要求,需要创建两个类,Card()和ATM(),
2、Card类中有卡号,有效期、以及卡的类型三个属性,在实例化对象时对其值初始化,还重写了str方法,也就是输出格式化,在遇到print时直接调用,然后输出规定格式的内容
3、ATM类的实例化方法中没有对其赋初值,但是有三个对象属性;
第一个是account:以字典的形式来存储卡号、密码以及余额;用字典的键来存卡号,再将其它的信息用字典存起来做为值,这样进行判断的时候可以通过键来取到卡的其它信息;(用字典存储的好处就是可以通过键来获取值)
第二个是curren_card,即用来存储当前卡是否存在,初始值为Nnoe
第三个是curren_account,在读卡的时候,如果卡号在数据库中(此处的数据库是最开始声明的账户字典)这将其键对应的值赋值给此变量,方便后续对密码以及余额操作;(关键点)
4.ATM中的方法:
①读卡——read_card(self,card)
要传入一个卡的对象,首先是判断插入的卡的卡号(卡类的实例化属性)是否在ATM的数据库中,如果再就将其卡号对应的值用curren_account给存储起来,在通过current_account(字典)取出其中的密码,与用户输入的密码进行比较是否一致,如果一致则读卡成功,可以进行下一步,密码只有三次的输入机会,如果三次错误则提示卡被收回;
def read_card(self,card):
# 插卡
# 阅读
# 输入密码
# 字典的成员运算符 in 验证的就是键
if card.card_no in self.accounts:
self.current_account = self.accounts[card.card_no]
for _ in range(3):
password = input('请输入您的密码')
if password != self.current_account['password']:
print('密码错误')
else:
self.current_card = card
return True # 是否读卡成功
else:
print('卡被收回,请致电123-456-789')
else:
print('无效银行卡请拿走')
return False # 默认读卡失败
写代码的逻辑:在进行if判断的时候,可以先将简单的完善,复杂的先用pass占位符,然后再回过头来去写复杂的,这样写起来会轻松很多。这样不仅能完善逻辑,而且能将复杂的事情简单化。如果先把if写完的话,可能会出现漏掉else的情况,或者else的位置错误等情况。
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
②展示余额——show_balance(self)
通过第一步的读卡操作将当前卡的其它信息保存到变量current_account中,此时的字典存储的就是卡的密码以及账户余额的信息,此时只要余额存在即就可以输出其余额了
def show_balance(self):
if self.current_account:
print(f'账户余额{self.current_account["balance"]}')
③存款——add_money(self,money)
存款和展示余额其实没什么差别,差别只是在于一个是展示,一个是对其进行增加,所以此方法还需要传入一个存钱的值,再者就是判断其账户存不存在了 ,如果存在则将钱加到原有的余额上,不存在则返回False
def add_money(self,money):
if money>=100 and self.current_account:
self.current_account['balance']+= money
print('存款成功')
return True
return False
④取款——withdraw(self,money)
取款时要传入一个取款金额的参数,取款方法除了要满足卡号存在的情况外,还要满足账户的余额大于要取款的金额,当满足以上两种情况时,才能取款,取款的操作就是将原有账户的余额减去取出的金额,剩下的就是该账户的余额了
def withdraw(self,money):
if money <= self.current_account['balance'] and self.current_account:
self.current_account['balance'] -= money
print('取款成功')
return True
else:
print('余额不足,请重新选择取款数目')
return False
⑤转账——transfer(self,other_card_no,money)
转账需要传入两个参数,一个是要转账的卡号(此处其实也可以传入一个卡的对象,然后再取出其卡号),还有一个就是要转账的金额;首先进行判断的是要转账的账户是否在数据库中,然后同样的将其卡号对应的其他值存储到一个变量中,再者就是判断转账金额和账户余额的大小情况,如果都满足的情况下,就将要转出的账户的余额减去转账的金额,接收的账户的余额加上转账的金额,此时转账就完成了
def transfer(self,other_card_no,money):
if other_card_no in self.accounts:
other_account = self.accounts[other_card_no]
if money<=self.current_account['balance']:
self.current_account['balance']-=money
other_account['balance']+=money
print('转账成功')
return True
else:
print('无效账户')
return False
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
⑥取卡——move_card(self)
取卡的方法就是将之前存储的卡号对应的信息给删除,然后提醒用户取走卡
def move_card(self):
self.current_card = None
self.current_account = None
print('请取走您的卡')
三、源码
# 银行卡类
# 卡号 有效期 卡的类型
# atm取款机类
# 数据库 读卡 存钱 取钱 转账
# 数据库 卡号 密码 余额 是否被冻结
class Card:
def __init__(self,card_no,expiry_date,card_type="储蓄卡"):
self.card_no = card_no
self.expiry_date = expiry_date
self.card_type = card_type
def __repr__(self):
return f'卡号:{self.card_no}\n有效期:{self.expiry_date}\n卡片类型:{self.card_type}'
class ATM:
def __init__(self):
self.accounts = {
'1122334455667788':{'password':'123456','balance':24000.00},
'1122334455667789':{'password':'654321','balance':45000.00},
'1122334455667790':{'password':'987654','balance':0.00},
}
self.current_card = None
self.current_account = None
def read_card(self,card):
# 插卡
# 阅读
# 输入密码
# 字典的成员运算符 in 验证的就是键
if card.card_no in self.accounts:
self.current_account = self.accounts[card.card_no]
for _ in range(3):
password = input('请输入您的密码')
if password != self.current_account['password']:
print('密码错误')
else:
self.current_card = card
return True # 是否读卡成功
else:
print('卡被收回,请致电123-456-789')
else:
print('无效银行卡请拿走')
return False # 默认读卡失败
def show_balance(self):
#展示余额
if self.current_account:
print(f'账户余额{self.current_account["balance"]}')
def add_money(self,money):
#存钱
if money>=100 and self.current_account:
self.current_account['balance']+= money
print('存款成功')
return True
return False
def withdraw(self,money):
#取钱
if money <= self.current_account['balance'] and self.current_account:
self.current_account['balance'] -= money
print('取款成功')
return True
else:
print('余额不足,请重新选择取款数目')
return False
def transfer(self,other_card_no,money):
#转账
if other_card_no in self.accounts:
other_account = self.accounts[other_card_no]
if money<=self.current_account['balance']:
self.current_account['balance']-=money
other_account['balance']+=money
print('转账成功')
return True
else:
print('无效账户')
return False
def move_card(self):
#取卡
self.current_card = None
self.current_account = None
print('请取走您的卡')
#实例化两张卡的对象
card1 = Card('1122334455667788','2222-10-24')
card2 = Card('1122334455667789','2222-10-24')
#实例化ATM对象
a = ATM()
#读取卡1的信息
a.read_card(card1)
#展示卡1的账户余额
a.show_balance()
#向卡1存款10000元
a.add_money(10000)
a.show_balance()
#从卡1取款6666元
a.withdraw(6666)
a.show_balance()
#向其它账户转账
a.transfer('1122334455667789',8888)
a.show_balance()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.