例子:账户对象
1、初始化账户类。添加姓名、余额属性
2、定义一个函数打印对象的所有属性。
3、余额不能从外部访问
4、为账户添加两个方法,分别是存钱save和取钱withdraw。再添加一个属性record,记录账户的交易记录,要求记录[交易日期,方式(create, save, withdraw),金额]。添加一个方法print_rec打印交易记录。
5、实现账户转账
6、添加对类实例的计数和列表
7、使用类方法打印所有账户信息
from datetime import datetime
class Account():
'''银行账户'''
acct = "Bank Account" #账户类型
count = 0
acctlist = []
def __init__(self,name,balance):
'''以账户名称、账户创立时的金额为信息创立账户'''
self.name = name
self.__balance = balance
daytime = datetime.now().strftime("%Y-%m-%d %H:%M") #当前时间
self.record = [[daytime,'creat',self.__balance]] #账户创立时的日期,姓名,金额
Account.count += 1
Account.acctlist.append(name)
def printall(self):
'''打印个人账户信息'''
print('Account name:',self.name,',Account balance:',self.__balance)
def set_dep(self,balance):
'''修改账户金额'''
if isinstance(balance,int) == True or \
isinstance(balance,float) == True: #非整数和浮点数输入无效
self.__balance = balance
else:print('Warning:balance should be numeric')
def save(self,income):
'''存款'''
self.__balance += income
daytime = datetime.now().strftime("%Y-%m-%d %H:%M")
self.record.append([daytime,'save',income])
def withdraw(self,payout):
'''取款'''
self.__balance -= payout
daytime = datetime.now().strftime("%Y-%m-%d %H:%M")
self.record.append([daytime,'withdraw',payout])
def print_rec(self):
'''打印账户交易记录'''
for i in self.record:
print(i)
def transfer_in(self,amt):
'''转入账户金额'''
self.__balance += amt
def transfer_to(self,toname,amt):
'''转账给他人'''
eval(f'{toname}.transfer_in(amt)')
self.__balance -= amt
@classmethod
def print_acctlist(cls):
'''打印所有账户列表'''
print(f'{cls.count} accounts in total:{cls.acctlist}')
例子:
lzs = Account('lzs',1000)
lzs.save(500)
lzs.withdraw(300)
lzs.print_rec()
结果:
['2020-03-31 17:24', 'creat', 1000]
['2020-03-31 17:24', 'save', 500]
['2020-03-31 17:24', 'withdraw', 300]
定义一个子类借记账户,要求借机账户可以存入和取现但不能透支
class DebitAcct(Account):
'''借记账户,账户不可以透支'''
def withdraw(self,payout):
'''取款,取款金额大于余额时,交易失败'''
if payout > self._Account__balance:
#调用其他类的隐私参数时,应该加上下划线前缀和类名
print('Warning:Operation failed with insufficient balance')
else:self._Account__balance -= payout
daytime = datetime.now().strftime("%Y-%m-%d %H:%M")
self.record.append([daytime,'withdraw',payout])
例子:
bobo = DebitAcct('bobo',100)
bobo.withdraw(50)
bobo.print_rec()
DebitAcct.print_acctlist()
结果:
['2020-03-31 17:24', 'creat', 100]
['2020-03-31 17:24', 'withdraw', 50]
2 accounts in total:['lzs', 'bobo']
定义一个子类信用账户,要求信用账户可以存入和取现并允许透支,但有额度限制
class CreditAcct(Account):
'''信用账户可以存入和取现并允许透支,但有额度限制'''
count = 0
acctlist = []
def __init__(self,name,balance,limit):
self.name = name
self.__balance = balance
self.limit = limit
daytime = datetime.now().strftime("%Y-%m-%d %H:%M") #当前时间
self.record = [[daytime,'creat',self.__balance]] #账户创立时的日期,姓名,金额
CreditAcct.count += 1
CreditAcct.acctlist.append(name)
def withdraw(self,payout):
'''取款'''
if self.__balance - payout < - self.limit:
print('Warning:Insufficient credit limit,withdraw failed')
else:
self.__balance -= payout
print(f'Successfully withdraw ${payout}')
daytime = datetime.now().strftime("%Y-%m-%d %H:%M")
self.record.append([daytime,'withdraw',payout])
def set_limit(self,limit):
self.limit = limit
@classmethod
def print_acctlist(cls):
'''打印所有账户列表'''
print(f'{cls.count} accounts in total:{cls.acctlist}')
例子:
xiaobo = CreditAcct('xiaobo',100,1000)
xiaobo.withdraw(500)
xiaobo.print_rec()
CreditAcct.print_acctlist()
结果:
Successfully withdraw $500
['2020-03-31 17:39', 'creat', 100]
['2020-03-31 17:39', 'withdraw', 500]
1 accounts in total:['xiaobo']