繁体   English   中英

保存 Object 并能够更新其属性

[英]Saving an Object and being able to update its attributes

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

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

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

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

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

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

如果有帮助,这里是我定义 class 和 object 的地方:

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

itemObject = Item("", 0, 0)

这是根据用户输入更新 class 属性的 function:

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 作为我的第一语言,我也是堆栈溢出的新手。 任何帮助,将不胜感激。 提前致谢。

您需要有条件地加载您尝试坚持的 object。

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()

运行一次以输入数据。 再次运行它,它将以与您开始时相同的 object 开头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM