寻找OOP Pythonic方法将对象放入“列表对象”而不是仅仅使用[list]

时间:2013-06-05 23:05:22

标签: python class oop

由于某种原因,我无法概念化如何使用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])

1 个答案:

答案 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练习更好:)