请帮我完善下列代码,完善内容希望有一些注释。

报错内容Traceback (most recent call last):
File "C:/Users/heliun/PycharmProjects/pythonProject/14.py", line 117, in
supermarket.mainmenu()
File "C:/Users/heliun/PycharmProjects/pythonProject/14.py", line 86, in mainmenu
goods = Goods(id, name, price, num,allprice)
UnboundLocalError: local variable 'allprice' referenced before assignment
具体代码:class Goods:
def init(self,id,name,price,num):
self.id=id
self.name=name
self.price=price
self.num=num

class MySuperMarket:
def init(self,id,name):
self.id=id
self.name=name
self.allingoods=[]
self.alloutgoods=[]
self.allinvent={}

def ingoods(self, goods):
    dict = {}
    dict[goods.id] = goods
    self.allingoods.append(dict)
    if goods.id in self.allinvent.keys():
        object = self.allinvent[goods.id]
        object.price = (object.price * object.num + goods.price * goods.num) / (object.num + goods.num)
        object.num = object.num + goods.num
        self.allinvent[object.id] =object
        return 1
    inventgoods=Goods(goods.id,goods.name,goods.price,goods.num)
    self.allinvent[inventgoods.id] = inventgoods
def outgoods(self,goods):
    dict={}
    dict[goods.id]=goods
    self.alloutgoods.append(dict)
    if goods.id in self.allinvent.keys():

        if goods.num<=object.num:
            object.num=object.num-goods.num
            self.allinvent[object.id]=object
        else :
            print("库存数量不足!清重新输入")
            goods.num=int(input("请重新输入商品的数量:"))
            object.num = object.num - goods.num
def allinventlook(self,goods):
    if goods.id in self.allinvent.keys():
        self.allinvent[object.id] = object
def outlook(self,goods):
    if goods.id in self.allinvent.keys():
        self.allinvent[object.id] = object

def inlook(self, goods):
    if goods.id in self.allinvent.keys():
        self.allinvent[object.id] = object

def mainmenu(self):
    while True:
        print("*"*8+self.name+"*"*8)
        print("1. 购进      2. 销售")
        print("3. 查询      0. 退出")
        print("*"*22)
        sele=int(input("请输入您的选择(0:退出):"))
        if sele==0:
            for k in self.allingoods:
                for v in k.values():
                    print(v.name,v.price,v.num)
            for v in self.allinvent.values():
                print(v.name,v.price,v.num,sep="  ")
            print("谢谢使用...")
            return 1
        elif sele==1:
            id=input("请输入购进的商品ID:")
            name=input("请输入购进的商品名称:")
            price=float(input("请输入商品单价:"))
            num=float(input("请输入商品数量:"))
            goods = Goods(id,name, price,num)
            self.ingoods(goods)
        elif sele==2:
            id=input("请输入销售商品的ID:")
            name=input("请输入销售商品的名称:")
            num= int(input("请输入销售商品的数量:"))
            price= int(input("请输入销售商品的单价:"))
            for a in self.alloutgoods:
                for b in i.values():
                    if b.id == id:
                        allprice = b.price * b.num

            goods = Goods(id, name, price, num,allprice)
            self.outgoods(goods)
        elif sele==3:
            print("*" * 8 + "查找类型"  +  "*" * 8)
            print("A. 查找库存商品      B.查找销售商品      C.查找进货商品")
            print("*" * 22)
            choose =input("请输入您的选择(#:退出):")
            id = input("请输入需要查询的库存商品的ID:")
            if choose=="A":
                goods = Goods(id, name, price, num, allprice)
                for c in self.allinvent:
                    for d in d.values():
                        print("名称:d.name"+"单价:d.price"+"数量:d.num")
            elif choose == "B":
                goods = Goods(id, name, price, num, allprice)
                for e in self.allinvent:
                    for f in b.values():
                        print("名称:f.name" + "单价:f.price" + "数量:f.num"+"总价:f.allprice")
            elif choose == "C":
                goods = Goods(id, name, price, num)
                for c in self.allinvent:
                    for d in d.values():
                        print("名称:d.name" + "单价:d.price" + "数量:d.num")

#主模块
supermarket=MySuperMarket("001","道奇超市")
supermarket.mainmenu()

报错原因

首先说一下报错原因,出现local variable 'xxx' referenced before assignment出现错误,一般会有两个原因:
情况一:变量没有被赋值直接引用了

def hello():
    print(a)   # 没有给a赋值,不知道a是什么

情况二:函数引用全局变量的时候没有声明
在函数内,既包含对全局变量的引用,又包含对其的赋值,且赋值放在了引用之后,就会报错。

money = 1000
def work(m):
   # 引用
    h = money + m
    print("h的值为:" + str(h))
    # 赋值
    money = h
    print("内部money的值:" + str(money))

work(200)

项目报错的原因是情况一。你在elseif语句中对变量进行赋值,只有选择了该分支,才会出现变量被赋值的情况;如果没有选择该赋值,则变量没有被赋值,这样直接引用自然会报错了。例如

# 当走分支 elif sele == 1 和 elif sele == 2时,id, name, num等变量都被赋值了,你使用下面的语句自然不会报错:
goods = Goods(id, name, price, num)  # 引用

# 当走分支 elif sele == 3时,没有对name, price, num, allprice等变量赋值, 这时候,如果直接走分支 if choose == "A" 就会立马报错了。

代码

# class,使用单数概念
class Good:
    # allprice 默认参数,只有出售商品列表需要用到该属性
    def __init__(self, id, name, price, num, allprice=0.0):
        self.id = id
        self.name = name
        self.price = price
        self.num = num
        self.allprice = allprice


class MySuperMarket:
    def __init__(self, id, name):
        self.id = id
        self.name = name
        self.allingoods = []  # list类型
        self.alloutgoods = []  # list 类型
        self.allinvent = {}  # dict类型

    # 进货
    def ingoods(self, good):
        # 添加商品到进货列表
        # 深拷贝,避免后续修改影响记录
        mgood = Good(good.id, good.name, good.price, good.num)
        self.allingoods.append(mgood)
        # 如果进货的商品有库存,修改库存信息
        if good.id in self.allinvent.keys():
            obj = self.allinvent[good.id]
            obj.price = (obj.price * obj.num + good.price * good.num) / (obj.num + good.num)
            obj.num = obj.num + good.num
            self.allinvent[obj.id] = obj
            return 1
        # 如果进货的商品无库存,直接添加到库存
        self.allinvent[good.id] = good

    # 销售
    def outgoods(self, good):
        # 出售商品,则添加商品到出售列表
        # 深拷贝,避免后续修改影响记录
        mgood = Good(good.id, good.name, good.price, good.num, good.allprice)
        self.alloutgoods.append(mgood)
        # 如果进货的商品有库存,且数量足够,则出售
        # 如果进货商品库存不足,则输出错误信息
        if good.id in self.allinvent.keys():
            obj = self.allinvent[good.id]
            if good.num <= obj.num:
                obj.num = obj.num - good.num
                self.allinvent[obj.id] = obj
            else:
                print("库存数量不足!清重新输入")
                good.num = int(input("请重新输入商品的数量:"))
                obj.num = obj.num - good.num

    # 查找库存商品信息
    def allinventlook(self, goods):
        if goods.id in self.allinvent.keys():
            obj = self.allinvent[goods.id]
            print("名称:%s, 单价:%.2f, 数量:%d" % (obj.name, obj.price, obj.num))
            return
        print("查找的商品无库存")

    # 查找销售记录
    # 同一类商品可能存在多条销售记录,所以添加换行
    def outlook(self, good):
        # 增加一个变量,记录是否查找到记录
        isfound = False
        for obj in self.alloutgoods:
            if good.id == obj.id:
                print("名称:%s, 单价:%.2f, 数量:%d 总价:%.2f"
                      % (obj.name, obj.price, obj.num, obj.allprice))
                # 找到记录,赋值为True
                isfound = True

        # 没有找到记录,则输出提示信息
        if not isfound:
            print("查找的商品无出售记录")

    # 查找进货记录
    # 同一类商品可能存在多条进货记录,所以添加换行
    def inlook(self, good):
        # 增加一个变量,记录是否查找到记录
        isfound = False
        for obj in self.allingoods:
            if obj.id == good.id:
                print("名称:%s, 单价:%.2f, 数量:%d" % (obj.name, obj.price, obj.num))
                # 找到记录,赋值为True
                isfound = True
        if not isfound:
            print("查找的商品无进货记录")

    def mainmenu(self):
        global allprice
        while True:
            print("*" * 8 + self.name + "*" * 8)
            print("1. 购进      2. 销售")
            print("3. 查询      0. 退出")
            print("*" * 22)
            sele = int(input("请输入您的选择(0:退出):"))
            if sele == 0:
                for v in self.allingoods:
                    print(v.name, v.price, v.num)
                for v in self.allinvent.values():
                    print(v.name, v.price, v.num, sep="  ")
                print("谢谢使用...")
                return 1
            # 进货
            elif sele == 1:
                id = input("请输入购进的商品ID:")
                name = input("请输入购进的商品名称:")
                price = float(input("请输入商品单价:"))
                num = int(input("请输入商品数量:"))
                goods = Good(id, name, price, num)
                self.ingoods(goods)
            # 销售
            elif sele == 2:
                id = input("请输入销售商品的ID:")
                name = input("请输入销售商品的名称:")
                num = int(input("请输入销售商品的数量:"))
                price = float(input("请输入销售商品的单价:"))
                allprice = 0
                # 根据仓库的数据,计算总成本
                for e in self.allinvent:
                    if e.id == id:
                        allprice = e.price * e.num

                goods = Good(id, name, price, num, allprice)
                self.outgoods(goods)
            # 擦找
            elif sele == 3:
                print("*" * 8 + "查找类型" + "*" * 8)
                print("A. 查找库存商品      B.查找销售商品      C.查找进货商品")
                print("*" * 22)
                choose = input("请输入您的选择(#:退出):")
                id = input("请输入需要查询的库存商品的ID:")
                if choose == "A":
                    goods = Good(id, "", 0, 0)
                    self.allinventlook(goods)
                elif choose == "B":
                    goods = Good(id, "", 0, 0, 0)
                    self.outlook(goods)
                elif choose == "C":
                    goods = Good(id, "", 0, 0)
                    self.inlook(goods)

# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    supermarket = MySuperMarket("001", "道奇超市")
    supermarket.mainmenu()

# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助

注释比较全了,如果有看不懂的,请提问。

有用,请点个采纳吧

你题目的解答代码如下:

class Goods:
    def __init__(self,id,name,price,num):
        self.id=id
        self.name=name
        self.price=price
        self.num=num

class MySuperMarket:
    def __init__(self,id,name):
        self.id=id
        self.name=name
        self.allingoods=[]
        self.alloutgoods=[]
        self.allinvent={}

    def ingoods(self, goods):
        dict = {}
        dict[goods.id] = goods
        self.allingoods.append(dict)
        if goods.id in self.allinvent.keys():
            object = self.allinvent[goods.id]
            object.price = (object.price * object.num + goods.price * goods.num) / (object.num + goods.num)
            object.num = object.num + goods.num
            self.allinvent[object.id] =object
            return 1
        inventgoods=Goods(goods.id,goods.name,goods.price,goods.num)
        self.allinvent[inventgoods.id] = inventgoods

    def outgoods(self,goods):
        if goods.id in self.allinvent.keys():
            dict={}
            dict[goods.id]=goods
            self.alloutgoods.append(dict)
            object = self.allinvent[goods.id]
            while True:
                if goods.num<=object.num:
                    object.num=object.num-goods.num
                    self.allinvent[object.id]=object
                    break
                else:
                    print("库存数量不足!清重新输入")
                    goods.num=int(input("请重新输入商品的数量:"))
        else:
            print("没有找到商品的ID")
    # def allinventlook(self,goods):
    #     if goods.id in self.allinvent.keys():
    #         self.allinvent[object.id] = object
    # def outlook(self,goods):
    #     if goods.id in self.allinvent.keys():
    #         self.allinvent[object.id] = object

    # def inlook(self, goods):
    #     if goods.id in self.allinvent.keys():
    #         self.allinvent[object.id] = object

    def mainmenu(self):
        while True:
            print("*"*8+self.name+"*"*8)
            print("1. 购进      2. 销售")
            print("3. 查询      0. 退出")
            print("*"*22)
            sele=int(input("请输入您的选择(0:退出):"))
            if sele==0:
                for k in self.allingoods:
                    for v in k.values():
                        print(v.name,v.price,v.num)
                for v in self.allinvent.values():
                    print(v.name,v.price,v.num,sep="  ")
                print("谢谢使用...")
                return 1

            elif sele==1:
                id=input("请输入购进的商品ID:")
                name=input("请输入购进的商品名称:")
                price=float(input("请输入商品单价:"))
                num=float(input("请输入商品数量:"))
                goods = Goods(id,name, price,num)
                self.ingoods(goods)
            elif sele==2:
                id=input("请输入销售商品的ID:")
                name=input("请输入销售商品的名称:")
                num= int(input("请输入销售商品的数量:"))
                price= int(input("请输入销售商品的单价:"))
                # for a in self.alloutgoods:
                #     for b in a.values():
                #         if b.id == id:
                #             allprice = b.price * b.num

                goods = Goods(id, name, price, num)
                self.outgoods(goods)
            elif sele==3:
                print("*" * 8 + "查找类型"  +  "*" * 8)
                print("A. 查找库存商品      B.查找销售商品      C.查找进货商品")
                print("*" * 22)
                choose =input("请输入您的选择(#:退出):").upper()
                id = input("请输入需要查询的库存商品的ID:")
                if choose=="A":
                    if id in self.allinvent:
                        d = self.allinvent[id]
                        print(f"名称:{d.name}  单价:{d.price}  数量:{d.num}")
                    else:
                        print("没有找到商品的ID")
                elif choose == "B":
                    allprice = 0
                    count = 0
                    for c in self.alloutgoods:
                        for d in c.values():
                            if id == d.id:
                                print(f"名称:{d.name}  单价:{d.price}  数量:{d.num}")
                                allprice += d.price*d.num
                                count += 1
                    if count>0:
                        print(f"总价:{allprice}")
                    else:
                        print("没有找到商品的ID")
                elif choose == "C":
                    allprice = 0
                    count = 0
                    for c in self.allingoods:
                        for d in c.values():
                            if id == d.id:
                                print(f"名称:{d.name}  单价:{d.price}  数量:{d.num}")
                                allprice += d.price*d.num
                                count += 1
                    if count>0:
                        print(f"总价:{allprice}")
                    else:
                        print("没有找到商品的ID")


#主模块
supermarket=MySuperMarket("001","道奇超市")
supermarket.mainmenu()

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

这个题貌似做过,不知道是不是跟你的需求一致,注释部分有功能描述,你可以参考一下,如果需求一致可以直接用,测试数据也提供了,如果有差别,请无视

'''
1.进货管理:通过收银员输入商品ID、名称、进货价格、数量实现进货与库存变化管理。
2.销售管理:通过收银员输入商品ID、名称、销售价格、数量实现销售与库存变化管理。
3.库存管理:
(1)打印库存明细表
(2)根据商品ID,输出该商品库存详细信息
4.统计查询:
(1)根据进货商品ID,输出所有该商品进货详细信息
(2)根据销售商品ID,输出所有该商品销售详细信息
(3)打印销售明细,并统计销售总金额
'''
class Goods:
    def __init__(self,id,name,price,num):
        self.id=id
        self.name=name
        self.price=price
        self.num=num
class MySuperMarket:
    def __init__(self,name):
        self.name=name
        self.all_store = {}
        self.all_in_goods={}
        self.all_out_goods={}

    def in_goods(self, good):
        id = good.id
        if id in self.all_store.keys():
            self.all_store[id].num += good.num
        else:
            self.all_store[id] = good
        if id in self.all_in_goods.keys():
            self.all_in_goods[id].append({'id':good.id,'name':good.name,'price':good.price,'num':good.num})
        else:
            self.all_in_goods[id] = [{'id':good.id,'name':good.name,'price':good.price,'num':good.num}]
    
    def out_goods(self, lst):
        for good in lst:
            self.all_store[good.id].num -= good.num
            if id in self.all_out_goods.keys():
                self.all_out_goods[good.id].append({'id':good.id,'name':good.name,'price':good.price,'num':good.num})
            else:
                self.all_out_goods[good.id] = [{'id':good.id,'name':good.name,'price':good.price,'num':good.num}]
    
    def show_store(self):
        print("="*8+'打印库存明细表'+"="*8)
        for v in self.all_store.values():
            if v.num>0:
                print(f'ID:{v.id}, 名称:{v.name} 进货价格:{v.price}, 数量:{v.num}')
        
    def show_store_by_id(self,id):
        print("="*8+'打印商品'+id+'的库存详细信息'+"="*8)
        if id in self.all_store.keys():
            v = self.all_store[id]
            print(f'ID:{v.id}, 名称:{v.name} 进货价格:{v.price}, 数量:{v.num}')
    
    def show_in_goods_by_id(self, id):
        print("="*8+'打印商品'+id+'的进货详细信息'+"="*8)
        if id in self.all_in_goods.keys():
            lst = self.all_in_goods[id]
            for v in lst:
                print(f'ID:{v["id"]}, 名称:{v["name"]} 进货价格:{v["price"]}, 数量:{v["num"]}')
    
    def show_out_goods_by_id(self, id):
        print("="*8+'打印商品'+id+'的销售详细信息'+"="*8)
        if id in self.all_out_goods.keys():
            lst = self.all_out_goods[id]
            for v in lst:
                 print(f'ID:{v["id"]}, 名称:{v["name"]} 销售价格:{v["price"]}, 数量:{v["num"]}')
    
    def show_out_goods(self,lst):
        print("="*8+'打印销售明细,并统计销售总金额'+"="*8)
        sum = 0
        for v in lst:
            print(f'ID:{v.id}, 名称:{v.name} 销售价格:{v.price}, 数量:{v.num}')
            sum+=v.price*v.num
        print(f'订单总价:{sum}')

    def mainmenu(self):
        print("*"*8+self.name+"*"*8)
        while True:
            print('*'*22)
            print("1. 购进      2. 销售")
            print("3. 查询      0. 退出")
            print("*"*22)
            select=int(input("请输入您的选择(0:退出):"))
            if select==0:
                print("谢谢使用...")
                break
            elif select==1:
                [id,name,price,num] = input("请输入进货信息(id,name,price,num):").split(',')
                goods = Goods(id,name,float(price),int(num))                
                self.in_goods(goods)
            elif select==2:
                lst = []
                while True:
                    info = input("请输入销售信息(id,name,price,num),输入#结束:")
                    if info=='#':
                        break
                    else:
                        [id,name,price,num] = info.split(',')
                        if id in self.all_store.keys():
                            if self.all_store[id].num>=int(num):
                                good = Goods(id,name,float(price),int(num))                
                                lst.append(good)
                            else:
                                print('库存不足')
                        else:
                            print('这个商品没有库存')
                self.out_goods(lst)
                self.show_out_goods(lst)
            elif select==3:
                print("1. 打印库存明细表")
                print("2. 根据商品ID,输出该商品库存详细信息")
                print("3. 根据商品ID,输出所有该商品进货详细信息")
                print("4. 根据商品ID,输出所有该商品销售详细信息")
                s1 = input('请输入选择:')
                if s1=='1':
                    self.show_store()
                else:
                    id = input('请输入商品ID:')
                    if s1=='2':
                        self.show_store_by_id(id)
                    elif s1=='3':
                        self.show_in_goods_by_id(id)
                    elif s1=='4':
                        self.show_out_goods_by_id(id)
if __name__=='__main__':
    mm = MySuperMarket('道奇超市')
    mm.mainmenu()

测试数据:
1
1,啤酒,10,100
1
2,花生,1,100
2
1,啤酒,20,10
2,花生,1.5,10
#
3
1
3
2
1
3
3
1
3
4
1
0
运行数据:
道奇超市

购进 2. 销售
查询 0. 退出
请输入您的选择(0:退出):1
请输入进货信息(id,name,price,num):1,啤酒,10,100

购进 2. 销售
查询 0. 退出
请输入您的选择(0:退出):1
请输入进货信息(id,name,price,num):2,花生,1,100

购进 2. 销售
查询 0. 退出
请输入您的选择(0:退出):2
请输入销售信息(id,name,price,num),输入#结束:1,啤酒,20,10
请输入销售信息(id,name,price,num),输入#结束:2,花生,1.5,10
请输入销售信息(id,name,price,num),输入#结束:#
========打印销售明细,并统计销售总金额========
ID:1, 名称:啤酒 销售价格:20.0, 数量:10
ID:2, 名称:花生 销售价格:1.5, 数量:10
订单总价:215.0

购进 2. 销售
查询 0. 退出
请输入您的选择(0:退出):3

打印库存明细表
根据商品ID,输出该商品库存详细信息
根据商品ID,输出所有该商品进货详细信息
根据商品ID,输出所有该商品销售详细信息
请输入选择:1
========打印库存明细表========
ID:1, 名称:啤酒 进货价格:10.0, 数量:90
ID:2, 名称:花生 进货价格:1.0, 数量:90
根据商品ID,输出该商品库存详细信息
根据商品ID,输出所有该商品进货详细信息
根据商品ID,输出所有该商品销售详细信息
请输入选择:3
请输入商品ID:1
========打印商品1的进货详细信息========
ID:1, 名称:啤酒 进货价格:10.0, 数量:100
购进 2. 销售
查询 0. 退出
请输入您的选择(0:退出):3

打印库存明细表
根据商品ID,输出该商品库存详细信息
根据商品ID,输出所有该商品进货详细信息
根据商品ID,输出所有该商品销售详细信息
请输入选择:4
请输入商品ID:1
========打印商品1的销售详细信息========
ID:1, 名称:啤酒 销售价格:20.0, 数量:10
购进 2. 销售
查询 0. 退出