0

以下を編集してください!

ここに私の Retail_item クラスがあります:

#RetailItem Class

class RetailItem:
    def __init__(self, desc, inventory, price):
        self.__desc=desc
        self.__inventory=inventory
        self.__price=price

#mutators
    def set_desc (self, desc):
         self.__desc=desc
    def set_inventory (self, inventory):
         self.__inventory=inventory
    def set_price (self, price):
         self.__price = price

#accessors
    def get_desc(self):
        return self.__desc
    def get_inventory(self):
        return self.__inventory
    def get_price(self):
        return self.__price

    def __str__(self):
        return 'Item Description:' + self.__desc, \
               '\tNumber of Units:' + self.__inventory, \
               '\tPrice: $' + self.__price

そして私の Cash_register クラス:

#CashRegister Class

class CashRegister:
    def __init__(self, purchase, total, show, clear):
        self.__purchase=purchase
        self.__total=total
        self.__show=show
        self.__clear=clear

#mutators
    def purchase_item(self, purchase):
        self.__purchase=purchase
    def get_total(self, total):
        self.__total=total
    def show_item(self, show):
        self.__show=show
    def clear(self, clear):
        self.__clear=clear

#accessors
    def acc_purchase(self):
        return self.__purchase
    def acc_total(self):
        return self.__total
    def acc_show(self):
        return self.__show
    def acc_clear(self):
        return self.__clear

そして最後に私のプログラム:

import retail_item
import cash_register

SHOW = 1
PURCHASE = 2
CART = 3
TOTAL = 4
EMPTY = 5
QUIT = 6

def main():
    mylist = make_list()
    #mycr = cash_register.CashRegister(mylist)

    choice = 0

    # Process menu selections until user quits program.
    while choice != QUIT:
        # Get the user's menu choice.
        choice = get_menu_choice()
        # Proces the choice.
        if choice == SHOW:
            show_items(mylist)
        elif choice == PURCHASE:
            purchase_item(mylist)
        elif choice == TOTAL:
            get_total(mylist)
        elif choice == EMPTY:
            clear(mylist)

def make_list():
    item_list = {}

    desc = 'Jacket'
    inventory = 12
    price = 59.95
    entry = retail_item.RetailItem(desc, inventory, price)
    item_list[desc]=entry

    desc = 'Jeans'
    inventory = 40
    price = 34.95
    entry = retail_item.RetailItem(desc, inventory, price)
    item_list[desc]=entry

    desc = 'Shirt'
    inventory = 20
    price = 24.95
    entry = retail_item.RetailItem(desc, inventory, price)
    item_list[desc]=entry

    return item_list

# The get_menu_choice function displays the menu and gets
#   a validated choice from the user.
def get_menu_choice():
    print()
    print('CASH REGISTER MENU')
    print('-------------------------')
    print('1. Show Retial Items')
    print('2. Purchase Item(s)')
    print('3. Show Current Shopping Cart')
    print('4. Show Total of Items Purchased')
    print('5. Empty Your Shopping Cart')
    print('6. Quit the program')
    print()

    # Get the user's choice.
    choice = int(input('Enter your choice: '))

    # Validate the choice.
    while choice < SHOW or choice > QUIT:
        choice = int(input('Enter a valid choice: '))

    # Return the user's choice.
    return choice

def show_items(mylist):
    print('\t\tDescription\t\tUnits in Inventory\t\tPrice')
    print('--------------------------------------------------------------------------------')
    x=1
    for item in mylist:
        print('Item #', x, '\t\t', item.get_desc(), '\t\t\t\t', item.get_inventory(), '\t\t\t$', format(item.get_price(), ',.2f'),sep='')
        print()
        x+=1

def purchase_item(mylist):
    desc = input('Enter the item you wish to purchase: ')
    if desc in mylist:
        amount=int(input('How many would you like to buy: '))
        if mylist[units]>0:
            mylist[units]-=amount
        elif (units-amount<0):
            mylist[units]=0
        else:
            mylist[units] = 0

    entry=cash_register.CashRegister(desc, units,)
    mylist[desc]=entry
    print()


def get_total(mylist):
    print()

def clear(mylist):
    print(mylist)
    mylist.clear()
    print(mylist)
main()            

私の質問は、クラスのオブジェクトを 1 つだけ更新するにはどうすればよいですか? また、cash_register クラスを呼び出すにはどうすればよいでしょうか。

割り当ての手順は次のとおりです。

この演習では、プログラミング演習 5 の RetailItem クラスを作成済みであることを前提としています。RetailItem クラスで使用できる CashRegister クラスを作成します。CashRegister クラスは、RetailItem オブジェクトのリストを内部的に保持できる必要があります。このクラスには次のメソッドが必要です。 • RetailItem オブジェクトを引数として受け入れる purchase_item という名前のメソッド。purchase_item メソッドが呼び出されるたびに、引数として渡される RetailItem オブジェクトをリストに追加する必要があります。• CashRegister オブジェクトの内部リストに格納されているすべての RetailItem オブジェクトの合計価格を返す get_total という名前のメソッド。• CashRegister オブジェクトの内部リストに格納されている RetailItem オブジェクトに関するデータを表示する show_items という名前のメソッド。• CashRegister オブジェクトの内部リストをクリアする clear という名前のメソッド。ユーザーが複数のアイテムを選択して購入できるようにするプログラムで CashRegister クラスのデモを行います。ユーザーがチェックアウトする準備ができたら、プログラムは購入のために選択したすべてのアイテムのリストと合計金額を表示する必要があります。

編集:これが私のやや最終的なコードです。見栄えが悪いことは承知しており、コメントが不足していることをお詫びします。まもなく提出しますが、まだフィードバックが欲しいです (私自身の改善と仕事の機会のために!) ここに:

import retail_item
import cash_register

SHOW = 1
PURCHASE = 2
TOTAL = 3
EMPTY = 4
QUIT = 5

def main():
    #set all variables to zero
    lister = []
    inv=[]
    cost=[]
    desc=''
    inventory=0
    price=0
    total=0
    purchase=0
    #setting variable for each class
    cash=cash_register.CashRegister(purchase, total, lister, inv, cost)
    retail=retail_item.RetailItem(desc, inventory, price)

    #classes
    desc = 'Jacket'
    inventory = 12
    price = 59.95
    #setting classes
    retail.set_desc(desc)
    retail.set_inventory(inventory)
    retail.set_price(price)
    #Adding to cart
    cash.purchase_item(retail.get_desc(), lister)
    cash.purchase_item(retail.get_inventory(), inv)
    cash.purchase_item(retail.get_price(), cost)

    desc = 'Jeans'
    inventory = 40
    price = 34.95
    retail.set_desc(desc)
    retail.set_inventory(inventory)
    retail.set_price(price)
    cash.purchase_item(retail.get_desc(), lister)
    cash.purchase_item(retail.get_inventory(), inv)
    cash.purchase_item(retail.get_price(), cost)

    desc = 'Shirt'
    inventory = 20
    price = 24.95
    retail.set_desc(desc)
    retail.set_inventory(inventory)
    retail.set_price(price)
    cash.purchase_item(retail.get_desc(), lister)
    cash.purchase_item(retail.get_inventory(), inv)
    cash.purchase_item(retail.get_price(), cost)

    choice = 0

    # Process menu selections until user quits program.
    while choice != QUIT:
        # Get the user's menu choice.
        choice = get_menu_choice()
        # Proces the choice.
        if choice == SHOW:
            show_items(cash, retail, lister, inv, cost)
        elif choice == PURCHASE:
            purchase_item(cash, retail, lister, inv, cost)
        elif choice == TOTAL:
            get_total(cash, retail, lister)
        elif choice == EMPTY:
            price=0
            cash.set_total(price)
            clear(cash, lister)


# The get_menu_choice function displays the menu and gets
#   a validated choice from the user.
def get_menu_choice():
    print()
    print('CASH REGISTER MENU')
    print('-------------------------')
    print('1. Show Retail Items')
    print('2. Purchase Item(s)')
    print('3. Show Total of Items Purchased')
    print('4. Empty Your Shopping Cart')
    print('5. Quit the program')
    print()

    # Get the user's choice.
    choice = int(input('Enter your choice: '))

    # Validate the choice.
    while choice < SHOW or choice > QUIT:
        choice = int(input('Please enter a valid choice: '))

    # Return the user's choice.
    return choice

def show_items(cash, retail, lister, inv, cost):
    print('\t\tDescription\t\tUnits in Inventory\t\tPrice')
    print('--------------------------------------------------------------------------------')
    cash.show_item(lister, inv, cost)


def purchase_item(cash, retail, lister, inv, cost):

    JACKET=1
    JEANS=2
    SHIRT=3
    QUIT=4
    choice=0

    print()
    print('WHICH WOULD YOU LIKE TO BUY')
    print('-------------------------')
    print('1. Jacket')
    print('2. Jeans')
    print('3. Shirt')
    print('4. Quit')
    print()

    print('Choose as many as you like. Press 4 then ENTER to quit.')
    while choice != QUIT:
        # Get the user's menu choice.
        choice = int(input('Which would you like to buy: '))
        if choice < JACKET or choice > QUIT:
            choice = int(input('Please enter a valid choice: '))

        while choice != QUIT:
            # Proces the choice.
            if choice == JACKET:
                desc = 'Jacket'
                inventory = 12
                price = 59.95
                retail.set_desc(desc)
                retail.set_inventory(inventory)
                retail.set_price(price)
                cash.purchase_item(retail.get_desc(), lister)
                cash.purchase_item(retail.get_inventory(), inv)
                cash.purchase_item(retail.get_price(), cost)
                cash.set_total(price)
                break
            elif choice == JEANS:
                desc = 'Jeans'
                inventory = 40
                price = 34.95
                retail.set_desc(desc)
                retail.set_inventory(inventory)
                retail.set_price(price)
                cash.purchase_item(retail.get_desc(), lister)
                cash.purchase_item(retail.get_inventory(), inv)
                cash.purchase_item(retail.get_price(), cost)
                cash.set_total(price)
                break
            elif choice == SHIRT:
                desc = 'Shirt'
                inventory = 20
                price = 24.95
                retail.set_desc(desc)
                retail.set_inventory(inventory)
                retail.set_price(price)
                cash.purchase_item(retail.get_desc(), lister)
                cash.purchase_item(retail.get_inventory(), inv)
                cash.purchase_item(retail.get_price(), cost)
                cash.set_total(price)
                break

    print()


def get_total(cash, retail, lister):    
    print()
    cash.show_items(cash.get_list(lister))
    print('Your total is: $', format(cash.cost_total(),',.2f'))

def clear(cash, lister):
    print('Shopping cart emptied.')
    lister=lister.clear()
    price=0
    cash.set_total(price)

    return lister
main()

RetailItem クラス:

class RetailItem:
    def __init__(self, desc, inventory, price):
        self.__desc=desc
        self.__inventory=inventory
        self.__price=price

#mutators
    def set_desc (self, desc):
        self.__desc=desc
    def set_inventory (self, inventory):
        self.__inventory=inventory
    def set_price (self, price):
        self.__price = price

#accessors
    def get_desc(self):
        return self.__desc
    def get_inventory(self):
        return self.__inventory
    def get_price(self):
        return self.__price

    def __str__(self):
        return 'Item Description:' + self.__desc, \
              '\tNumber of Units:' + self.__inventory, \
              '\tPrice: $' + self.__price

繰り返しますが、最後に私の CashRegister クラス:

#CashRegister Class

class CashRegister:
    def __init__(self, purchase, total, lister, inv, cost):
        self.__purchase=purchase
        self.__total=total
        self.__lister=[]
        self.__inv=[]
        self.__cost=[]


#mutators
    def purchase_item(self, purchase, lister):
        self.__purchase=purchase
        lister.append(purchase)
        return lister

    def set_total(self, price):
        self.__total+=price


    def show_item(self, lister, inventory, price):
        i=0
        while i<len(lister):
            s=('Item # %i\t%s\t\t\t\t%i\t\t\t%4.2f') % ((i+1),lister[i],inventory[i],price[i])
            s = s.strip(' \t\n\r')
            print(s)
            i+=1

    def show_items(self, lister):
        i=0
        print('You have purchased the following items')
        while i<len(lister):
            print(lister[i])
            i+=1

    def clear(self, lister):
        i=0
        while i<len(lister):
            del lister[i]
            i+=1
            return lister

    def get_list(self, lister):
        return lister
#accessors
    def acc_purchase(self):
        return self.__purchase
    def cost_total(self):
        return self.__total
    def acc_show(self):
        return self.__show
    def acc_clear(self):
        return self.__clear

みんなありがとう!私はこのサイトを頻繁に使用しました。今回は皆さんがくれたものをあまり使用しませんでしたが、それでも素晴らしいです!

4

1 に答える 1

2

このコードにはいくつかの大きな問題があります。スタック トレースがなければ、なぜ AttributeError が発生するのか正確にはわかりませんが、CashRegister オブジェクトを記述どおりにインスタンス化できないことはわかります。__init__存在しない変数 (item と items) を参照しています。

あなたの CashRegister クラスは、__init__必要のない引数を取ります - 場合によってはメソッドにする必要があります。CashRegister クラスが引数を取る必要がある理由はわかりません__init__。RetailItem オブジェクトのリストと、おそらく現在の合計を初期化し、他に何もしない必要があります。purchase_item はこれらの内部属性を更新し、get_total と show_items はそれらを読み取り (現在の合計を保持していない場合は get_total がリストに基づいて合計を計算する必要があります)、clear は両方をリセットする必要があります。

スタイル的には、ミューテーターとアクセサー、および非表示の内部データは、Python のイディオムではありません。一般に、Python クラスはメンバー データを直接取得および設定し、動作を変更する必要がある場合はプロパティを使用するようにリファクタリングされます。これはクラス/演習用であるため、必須であるため使用している可能性がありますが、そうでない場合は、使用しない方がよいでしょう。

編集

これは私の main() がどのように見えるかであり、ロジックを表示するために最小限の編集を行います:

def main():
    items = make_list()
    mycr = cash_register.CashRegister()
    # at this point, mycr.show_items() should return [] and mycr.get_total() should return 0
    choice = 0
    while choice != QUIT:
        choice = get_menu_choice()
        if choice == SHOW:
            mycr.show_items()
        elif choice == PURCHASE:
            item, quantity = get_purchase(items)
            if item and quantity:
                item.set_inventory(max(0, item.get_inventory() - quantity))
                mycr.purchase_item(item, quantity)
        elif choice == TOTAL:
            print(mycr.get_total())
        elif choice == EMPTY:
            mycr.clear()

def get_purchase(items):
    desc = input('Enter the item you wish to purchase: ')
    if desc in items:        
        amount=int(input('How many would you like to buy: '))
        return items[desc], amount
    else:
        return None, 0

これはすべての可能性をカバーしているわけではありません - たとえば、元のコードでは、数量を 0 に設定する以外に副作用なしで現在利用可能な数量よりも多くの数量を入力できます。しかし、演習の説明では在庫追跡について言及されていないため、おそらく要件ではありません。

于 2013-05-02T20:17:57.533 に答える