由于某种原因,我无法概念化如何使用Checkbook.class对象而不是“ledger [list]”试图保持我的方法OOP。什么是实现此代码目标的最佳实践方法? (是的,我也有其他“新手”的问题,但我很高兴得到一些意见。)
import sys
import time
transNum=0
ledger = []
debitInput=['Check Number: ', 'Transaction Date: ',
'Payee: ', 'Amount: ', 'Memo (or Enter to skip): ']
creditInput=['Check Number: ', 'Transaction Date: ',
'Source: ', 'Amount: ', 'Memo (or Enter to skip): ']
# a Payee is a persistent record/lookup of current, past and new payees
class Payee:
pass
# a Source is a persistent record/lookup of current, past and new sources
class Source:
pass
# a Checkbook is a collection of Transaction objects upon which queries may be performed
class Checkbook:
def __init__(self, newTrans):
pass
# a Transaction is a collection of Debit and Credit objects
class Transaction:
def __init__(self, chkNum, transDate, thirdParty, amount, memo=''):
self.chkNum = chkNum
self.transDate = transDate
self.memo=memo
self.thirdParty=thirdParty
self.amount=amount
self.transNum = transNum
class Debit(Transaction):
def __init__(self, *args):
Transaction.__init__(self, *args)
self.payee=self.thirdParty
del self.thirdParty
self.amount=int(self.amount)*-1
class Credit(Transaction):
def __init__(self, *args):
Transaction.__init__(self, *args)
self.source=self.thirdParty
del self.thirdParty
self.amount=int(self.amount)
while True:
transact = []
transNum += 1
choice=input('Posting debit [d], credit [c] or [x] to exit: ')
if choice == 'x': break
elif choice == 'd':
for field in debitInput:
field = input(field)
transact.append(field)
trans = Debit(transact[0], transact[1], transact[2], transact[3], transact[4])
ledger.append(trans)
elif choice == 'c':
for field in creditInput:
field = input(field)
transact.append(field)
trans = Credit(transact[0], transact[1], transact[2], transact[3], transact[4])
答案 0 :(得分:1)
class Checkbook:
def __init__(self):
self.transactions = [] # Checkbook is just a wrapper around a list
def __getitem__(self, index): # implementing [x]
return self.transactions[index]
def __setitem__(self, index, transaction): #implementing [x] = i
self.transactions[index] = transaction
def append(self, transaction): # implementing .append(x)
self.transactions.append(transaction)
def extend(self, transaction_list): # implementing .extend([x,y,z])
self.transactions.extend(transaction_list)
# and so on for every method which you want to support
或者你可以subclass list
。
这是作业吗?用Python分配这个很傻。 You'd never really want to subclass list
。我在大学里有一个更好的练习,我不得不重新实现std::vector
使用模板,动态数组(malloc()
)和运算符重载......真有趣! std::map
练习更好:)