Как эффективно использовать объекты в Python - PullRequest
0 голосов
/ 19 сентября 2019

Итак, я пытаюсь создать виртуальный книжный магазин, и когда я запускаю свой код, я получаю сообщение об ошибке.

ask = True
def stop():
while ask:
    stop_or_no()

def stop_or_no():
menu = int(input(" 1: Display Books \n 2: Add to cart: \n 3 Show cart  \n 4: Checkout \n 5: Quit \nSelect an option in number form: "))


class Book:
    def __init__(self,title,author,genre,price):
        self.title = title
        self.author = author
        self.genre = genre
        self.price = price
    def __str__(self):
        return self.title + "," + self.author + "," + self.genre + "," + str(float(self.price))
if menu == 1:

    book1 = Book("A visual Encyclopedia","Chris Woodford", "Science", 23.99)
    book2 = Book("My First Human Body Book", "Patricia J. Wynne and Donald M. Silver","Science", 3.99)
    book3 = Book("The Runaway Children", "Sandy Taylor","Fiction", 3.99)
    book4 = Book("The Tuscan Child", "Rhys Bowen","Fiction", 9.99)
    book5 = Book("Learning Python", "Mark Lutz","Programming", 61.99)
class Inventory:
    books = {1000 : str(book1), 1001 : str(book2), 1002 : str(book3), 1003 : str(book4), 1004 : str(book5)}
    print(books)

    def add_book1(self):
        book_list = open("C:\\Users\\brian\\Documents\\Coding\\booklist.txt")
        print(book_list.read())
    def display(self):
        print(books)
class Cart(Inventory):
    cart = []
    def add_book(self):
        total_price = 0
        to_buy_books = int(input("What is the item number you would like to buy?"))
        how_many_books = input("How many of that item would you like to buy?") 
        if to_buy_books == 1000:
            total_price += how_many_books * 23.99
            cart.append(to_buy_books)
        elif to_buy_books == 1001:
            total_price += how_many_books * 3.99
        elif to_buy_books == 1002:
            total_price += how_many_books * 3.99
            cart.append(to_buy_books)
        elif to_buy_books == 1003:
            total_price += how_many_books * 9.99
            cart.append(to_buy_books)
        else:
            total_price += how_many_books * 61.99
            cart.append(to_buy_books)



    def checkout(self):
        if total_price == 0:
            print("There is nothing in your cart")
        else:
            print(total_price)
            print("Thank you for shopping with us today! Please come back again!")

if menu == 2:
    cart1 = Cart.add_book
elif menu == 3:
    if len(cart) == 0:
        print("Cart is empty")
    else:
        print(str(cart))
elif menu == 4:
    Cart.checkout
else:
    ask = False
    print("Thank you for using this application")


stop()

Я ожидал, что код будет работать гладко, но когда я его запускаю, он печатаетэто сообщение об ошибке:

Traceback (most recent call last):
  File "C:\Users\brian\Documents\Coding\FinalProject_Bmason1270130.py", line 81, in <module>
    stop()
  File "C:\Users\brian\Documents\Coding\FinalProject_Bmason1270130.py", line 7, in stop
    stop_or_no()
  File "C:\Users\brian\Documents\Coding\FinalProject_Bmason1270130.py", line 28, in stop_or_no
    class Inventory:
  File "C:\Users\brian\Documents\Coding\FinalProject_Bmason1270130.py", line 29, in Inventory
    books = {1000 : str(book1), 1001 : str(book2), 1002 : str(book3), 1003 : str(book4), 1004 : str(book5)}
NameError: free variable 'book1' referenced before assignment in enclosing scope

1 Ответ

0 голосов
/ 19 сентября 2019

Вы определяете book1, если menu == 1, но если menu! = 1, то book1 не определена.Далее Вы определяете класс Inventory, который имеет переменную класса, которая использует book1, которая, если menu! = 1, не определена.Помните, что переменные класса оцениваются, когда класс определен, как вы можете видеть в этом примере.

class Obj:
    var = print('var init')

, который немедленно выводит 'var init'.Просто определите book1,…, book5 в любой области, в которой они вам понадобятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...