【问题标题】:User input not saving into inventory list用户输入未保存到库存列表中
【发布时间】:2019-02-26 21:27:02
【问题描述】:

基本上,我正在制作一个应用程序来更好地帮助我管理我的 ebay 商店。我对编程和 OOP 还是很陌生。在看了一些教程之后,我拼凑了以下代码。到目前为止,一切都运作良好。我目前坚持的是,当用户输入库存物品时,它并没有保存它。而且,当用户想要查看库存时,他们添加的项目不会填充。任何输入或建议都会非常受用。

def Inventory():
    All_Inventory = {}

class Ebay_Inventory:

    def __init__(self, manufacturer, object_type, price):
        self.manufacturer = manufacturer
        self.object_type = object_type
        self.price = price

    def add_item(self):
        manufacturer = input("Enter Manufacturer: ")
        object_type = input("Enter what the item is: ")
        price = input("Enter price: ")

        item_info = Ebay_Inventory(manufacturer, object_type, price)
        All_Inventory = item_info
        print("Item added successfully")

    def delete_item(self):
        delete = input("What is the item you want to delete?: ")
        if delete in All_Inventory.keys():
            del[delete]
            print("The item entered has been deleted.")
        else:
            print("Item not found")


    def sale_status(self):
        update = input("What is the item you want to update?:")
        if update in All_Inventory.keys():
            pass
        else:
            print("Item not found")


user=True
while user:
    print("\n1. Add to item inventory")
    print("2. Remove item from inventory")
    print("3. Update sale status")
    print("4. View inventory")
    print("5. Exit program")
    user_wants=input("What would you like to do today?")
    if user_wants=="1":
        Ebay_Inventory.add_item(input)
    elif user_wants=="2":
        Ebay_Inventory.delete_item(input)
    elif user_wants=="3":
        Ebay_Inventory.sale_status(input)
    elif user_wants=="4":
        print(All_Inventory)
    elif user_wants=="5":
        print("\n Thank you for using item inventory.")
        break
    elif user_wants!="":
        print("\n Input not understood. Please try again.")

【问题讨论】:

  • 您在类外的函数中定义Inventoryall_inventory,但该函数的唯一目的是声明一个局部空集。然后,每次尝试添加项目时递归地创建一个新的 ebay_inventory 对象。这看起来像是函数式编程和面向对象编程的奇怪混搭

标签: python oop inventory


【解决方案1】:

你需要了解 Scope、OOP 和 dicts:

您没有添加到您的Inventory.All_Inventory - 您使用All_Inventory = item_info 创建一个新的本地

你把静态类属性和实例属性混为一谈,阅读:

您正在错误地删除/访问您的字典 - 请参阅:

固定:

class Ebay_Inventory:
    Inventory = {}                                    # class property


    @staticmethod
    def print_inventory():
        for k in Ebay_Inventory.Inventory:
            for i in Ebay_Inventory.Inventory[k]:
                print(k,i)

    class Ebay_Item:
        def __init__(self, key, manufacturer, object_type, price):
            self.manufacturer = manufacturer
            self.object_type = object_type
            self.price = price 
            self.key = key

        def __str__(self):
            return f"{self.manufacturer} {self.object_type} {self.price}"

        def __repr__(self):
            return str(self)

    @staticmethod    
    def add_item(key=None, man=None, obj=None, pri=None):
        # use values if given, else ask - this is for demo purposes only
        key = key or input("Enter key: ")
        manufacturer = man or input("Enter Manufacturer: ")
        object_type = obj or input("Enter what the item is: ")
        price = pri or input("Enter price: ")

        # create new item   
        item_info = Ebay_Inventory.Ebay_Item(key, manufacturer, object_type, price)

        # add to class member, create key if need be
        Ebay_Inventory.Inventory.setdefault(item_info.key,[]).append(item_info)

    def delete_item(key=None):
        delete = key or input("What is the item you want to delete?: ")
        if delete in Ebay_Inventory.Inventory:
            del Ebay_Inventory.Inventory[delete]
            print("The item entered has been deleted.")
        else:
            print("Item not found")

    def __str__(self):
        return Ebay_Inventory.print_inventory()

# add 2 items and print
Ebay_Inventory.add_item(1,"Me","Me",1000)
Ebay_Inventory.add_item(2,"You","You",1000)
Ebay_Inventory.print_inventory()

# remove non existent and existent item and print
Ebay_Inventory.delete_item(3)
Ebay_Inventory.delete_item(2)
Ebay_Inventory.print_inventory()

输出:

1 Me Me 1000
2 You You 1000
Item not found
The item entered has been deleted.
1 Me Me 1000

【讨论】:

    【解决方案2】:

    很抱歉大量修改您的代码,但我认为这更像是您的目标:

    class EbayInventory:
        def __init__(self):
            self.all_inventory = []
    
        def print_items(self):
            print('Current item list by index:')
            for i in range(0, len(self.all_inventory)):
                print("{} -> {}".format(i+1, self.all_inventory[i]))
    
        def add_item(self):
            manufacturer = input("Enter Manufacturer: ")
            object_type = input("Enter what the item is: ")
            price = input("Enter price: ")
            item = {'manufacturer': manufacturer, 'type': object_type, 'price': price}
            self.all_inventory.append(item)
            print("Item added successfully")
    
        def delete_item(self):
            self.print_items()
            delete = int(input("Item id you want to delete: "))
            try:
                del self.all_inventory[delete - 1]
                print("The item entered has been deleted.")
            except Exception as e:
                print("An error occurred deleting that item, details below")
                print(e)
    
        def sale_status(self):
            self.print_items()
            update_index = int(input("Item id you want to update: "))
            if update_index > len(self.all_inventory) or update_index <= 0:
                print("You're trying to change an item that doesn't exist!!")
                return
            print("OK. Let's get that item up to date!")
            manufacturer = input("Enter Manufacturer: ")
            object_type = input("Enter what the item is: ")
            price = input("Enter price: ")
            item = {'manufacturer': manufacturer, 'type': object_type, 'price': price}
            self.all_inventory[update_index - 1] = item
            print("OK. We got that update taken care of")
    
    if __name__ == "__main__":
        my_app = EbayInventory()
        while True:
            print("\n1. Add to item inventory")
            print("2. Remove item from inventory")
            print("3. Update sale status")
            print("4. View inventory")
            print("5. Exit program")
            user_wants = input("Please enter the number corresponding to how you would like help: ")
            if user_wants == "1":
                my_app.add_item()
            elif user_wants == "2":
                my_app.delete_item()
            elif user_wants == "3":
                my_app.sale_status()
            elif user_wants == "4":
                my_app.print_items()
            elif user_wants == "5":
                print("Thank you for using item inventory.")
                break
            else:
                print("Input not understood. Please try again.")
    

    你有一个变量user 什么也没做。您可以简单地使用while True: 进入无限循环。如果您想按照您的方式循环,那么您可以使用user = False 而不是break 来跳出循环。这有时是一个漂亮的技巧,但我认为在这里没有意义。在我看来,库存确实是唯一可以通过存储在您的类中受益的东西,然后方法可以通过self.all_inventory 访问它来调整它。我移动了您的代码以要求 add_item()sale_status() 方法输入项目,所以现在主代码块看起来更清晰了。我还把它包裹在if __name__ == "__main__": 中,这样你就可以在不运行整个程序的情况下将这个类导入另一个项目!我还使用try:except: 子句进行了一些基本的错误检查。我认为您误解了ClassInstance 之间的区别。所以在我的代码中Class 是EbayInventory,但Instancemy_app。您创建类的实例,就像我对my_app = EbayInventory() 所做的那样,然后 self 现在引用 my_app。这样我就可以打电话给my_app.add_item()。但是,您可以拥有多个对象实例,并且它们在您的计算机内存中都有自己的空间。所以你可以说:

    app1 = EbayInventory()
    app2 = EbayInventory()
    app1.add_item()
    

    并且只有 app1 会有任何物品,而 app2 仍然是一个空列表,但仍然有 methods 通过app2.add_item() 建立库存。不过,要回答您的主要问题,您永远不会调用您的函数Inventory(),因此它不存在保存您的信息。当您调用 item_info = Ebay_Inventory(manufacturer, object_type, price) 实际上您正在创建一个类的 Instance 时,在这里这样做真的很荒谬,因为这意味着在下一行您可以说 item_info.add_item() 这将使 另一个实例,但您没有将此信息保存在任何地方,因此您永远无法检索它!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 2017-05-21
      • 1970-01-01
      • 2012-01-06
      • 2014-08-20
      • 2021-01-29
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多