【问题标题】:Saving an Object and being able to update its attributes保存对象并能够更新其属性
【发布时间】:2023-01-13 18:07:25
【问题描述】:

我正在用 Python 创建一个 POS 系统,它几乎完成了。 (不包括 GUI)。但是,我希望能够存储用户注册的项目。

我尝试将对象保存到文件中,但这没有帮助:

with open('myObject.pkl', 'wb') as outp:
    itemObject = Item("", 0, 0)
    pickle.dump(itemObject, outp, pickle.HIGHEST_PROTOCOL)

即使在我输入商品的详细信息(“名称”、价格、库存)并退出程序后,当我再次启动它时,我也必须重新注册该商品。

我也在网上搜索了这件事,但是我得到的所有结果都不支持更新文件中对象的属性。

我也在论坛上查看了更多示例,但没有一个能很好地满足我的需求,比如这个:Saving an Object (Data persistence)Python- Saving list of objects and its attributes

如果有帮助,这里是我定义类和对象的地方:

class Item:
    def __init__(self, name, price, stock):
        self.name = name 
        self.price = price
        self.stock = stock

itemObject = Item("", 0, 0)

下面是根据用户输入更新类属性的函数:

def regItem():
    name = input("What is your item called? ")
    name.lower()
    if name == 'exit':
        exit()
    try:
        price = int(input("How much does it cost? "))
        name.lower()
        if name == 'exit':
            exit()
        if (isinstance(price, int)):
            stock = input("How much stock is available for this item? ")
            name.lower()
            if name == 'exit':
                exit()
            itemObject.name = name
            itemObject.price = price
            itemObject.stock = stock
            int(itemObject.price)
            int(itemObject.stock)
            print("Item",itemObject.name,"priced at",itemObject.price,"with available stock of",itemObject.stock,"has been registered")
            start()
    except ValueError:
        print("Must be a number")
        regItem()

我正在学习 Python 作为我的第一语言,我也是堆栈溢出的新手。任何帮助,将不胜感激。提前致谢。

【问题讨论】:

  • Python 在启动时不会神奇地将 pickle 文件与对象相关联。你必须加载 pickle 文件。在启动时,检查 pickle 文件。如果它存在,则加载其中的对象。如果您能够做到这一点,请跳过 regItem 步骤。如果没有,则让用户注册它。我无法从您的示例中真正分辨出 itemObject 来自何处,因此我没有任何代码示例可以共享。

标签: python data-persistence


【解决方案1】:

您需要有条件地加载您尝试保留的对象。

import os
import pickle

class Item:
    def __init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock

    def __str__(self):
        return f"Item {self.name} priced at {self.price} with available stock of {self.stock}"

def regItem():
    name = input("What is your item called? ")
    name.lower()
    if name == 'exit':
        exit()
    try:
        price = int(input("How much does it cost? "))
        name.lower()
        if name == 'exit':
            exit()
        if (isinstance(price, int)):
            stock = input("How much stock is available for this item? ")
            name.lower()
            if name == 'exit':
                exit()
            itemObject = Item(name, price, stock)
            print(f"{itemObject} has been registered")
            return itemObject
    except ValueError:
        print("Must be a number")
        return regItem()

def start(obj):
    print("Starting {}".format(obj))

def main():
    filename = 'myObject.pkl'

    if os.path.exists(filename):
        with open(filename, 'rb') as inp:
            itemObject = pickle.load(inp)
    else:
        itemObject = regItem()

        with open('myObject.pkl', 'wb') as outp:
            pickle.dump(itemObject, outp, pickle.HIGHEST_PROTOCOL)

    start(itemObject)

main()

运行一次以输入数据。再次运行它,它将以您开始使用的相同对象开始。

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2016-12-19
    • 2016-08-28
    相关资源
    最近更新 更多