zoukankan      html  css  js  c++  java
  • 面向对象购物车ver2.0

    #!/usr/bin/env python 
    # -*- coding:utf-8 -*-
    # 开发团队: 奶豆的小铺
    # 开发人员: bcz
    # 开发时间: 2020/12/12 21:07
    
    import pickle
    import os
    import sys
    
    
    Base_Dir = os.path.dirname(os.path.dirname(__file__))
    project_dir = os.path.dirname(__file__)
    #商品类
    class Goods():
        def __init__(self,name,price,number):
            self.name = name
            self.price = price
            self.number = number
    
        def __str__(self):
            return (f"商品名称{self.name} 商品数量 {self.number} 单品价值 {self.number * self.price}")
    
        #购买商品
        def buy_goods(self,goods,nums):
            if self.name == goods.name:
                if nums > self.number:
                    return False#购买不成功
                else:
                    self.number -= nums
                    return True#购买成功
    
    
        #退商品
        def return_goods(self,name,nums):
            if self.name == name:
                self.number += nums
                return True
            return False
    
    
    
    
    
    #商店管理员
    class Admin():
        opt_list = [("创建商品", 'create_goods'),
                    ("查看所有商品", 'show_all_goods'),
                    ('退出', 'exit')
                    ]
        def __init__(self,name):
            self.name = name
    
        def create_goods(self):
            '''创建商品'''
            name = input('请输入商品名称: ')
            price = float(input('请输入商品价格: '))
            num = int(input('请输入商品数量: '))
            goods_obj = Goods(name,price,num)
            with open('goods_list_info','ab') as f:
                pickle.dump(goods_obj,f)
            print(f'{goods_obj}商品创建成功')
    
    
    
    
        def show_all_goods(self):
            '''查看所有商品'''
            with open('goods_list_info','rb') as f:
                count = 0
                while True:
                    try:
                        count +=1
                        goods_obj = pickle.load(f)
                        print(f'商品序号:{count},商品名称:{goods_obj.name},商品价格:{goods_obj.price},商品数量:{goods_obj.number}')
                    except EOFError:
                        print('还没有商品,请先添加商品')
                        break
    
        def exit(self):
            exit('欢迎下次使用')
    
    
    
    
    
    
    #顾客类
    class Customer():
    
        opt_list = [("购买商品", 'select_goods'),
                    ("退商品", 'return_goods'),
                    ('退出', 'exit'),
                    ('打印列表',"show_goods")
                    ]
        #初始化一个对象就显示一下所有的商品
        def __init__(self,salary_all_money):
            self.salary_all_money = salary_all_money
            self.shopping_car = []
            self.shopping_money = 0
            self.goods_list = []
            self.show_goods()
    
    
    
        def show_goods(self):
            count = 0
            #先把商品从二进制文件中读取出来放到self.goods_list
            with open('goods_list_info','rb') as ff:
                while True:
                    try:
                        count+=1
                        goods_obj = pickle.load(ff)
                        print(f'商品序号:{count},商品名称:{goods_obj.name},商品价格:{goods_obj.price},商品数量:{goods_obj.number}')
                        self.goods_list.append(goods_obj)
    
                    except EOFError:
                        break
    
        def add_shopping_car(self,buy_goods):
            for item in self.shopping_car:
                if item.name == buy_goods.name:#证明购物车中有此商品
                    item.number += buy_goods.number
                    return  item.number
            else:
                self.shopping_car.append(buy_goods)
                return buy_goods.number
    
    
         # 购买商品
        def select_goods(self):
            # 现打印所有商品
            self.show_goods()
            number_goods = int(input('请输入你选择的商品的序号:  '))
            num_goods = int(input('请输入购买该商品的数量: '))
            if number_goods > len(self.goods_list):
                print("输入错误")
            else:
                googs_info = self.goods_list[number_goods-1]  # 商品对象信息
                money = googs_info.price * num_goods  # 选择商品需花的钱
                if self.salary_all_money - self.shopping_money < money:
                    print("余额不足")
                elif googs_info.buy_goods(googs_info, num_goods):
                    buy_googs = Goods(googs_info.name, googs_info.price, num_goods)
                    #购买后购物车中该商品的数量
                    googs_all_num = self.add_shopping_car(buy_googs)
                    # self.shopping_car.get(buy_googs.name)
                    self.shopping_money = self.shopping_money + money
                    print(f'您选择了{buy_googs.name}商品,购买了{googs_all_num}个')
                else:
                    print("商品不足")
        def return_goods(self):
            '''退商品'''
    
            # #循环自己的购物车,选择自己想退的商品然后从新pickle商品清单
            goods_name_return = input('请输入你想退的商品名称: ')
            for row in self.shopping_car:
                if goods_name_return == row.name:
                    number_return = int(input('请输入你想退的数量: '))
                    if number_return > row.num:
                        print('你没有购买那么多该商品,退货不成功: ')
                        break
                    else:
                        row.num =  row.num - number_return
                        for goose_info in self.goods_list:
                            if goose_info.return_goods(goods_name_return,number_return):
                                break
                        # self.show_goods()
                        self.shopping_money = self.shopping_money + number_return * row.price
                        print('退货成功')
                        break
                else:
                    print('你没有购买该商品: %s ' %goods_name_return)
    
            # for index,item in enumerate(self.shopping_car,1):
            #     if item[0] == goods_name_return:
            #         number_return = int(input('请输入你想退的数量: '))
            #         if number_return <= item[1]:
            #             self.shopping_car.remove(item)
            #             item[1] -= number_return
            #             self.shopping_car.append([item[0],item[1],item[2]])
            #             print('退货成功')
            #             break
            #         else:
            #             print('你没有购买那么多该商品,退货不成功: ')
            #             break
            #     else:
            #         print('你没有购买该商品: ')
            #         break
    
    
        '''显示顾客的消费信息 包括该顾客购买了哪些商品 分别购买了多少 购买的单价'''
        def show_shop_info(self):
            with open('customer_shop_info','ab') as f:
                pickle.dump(self.shopping_car,f)#把该顾客的购物车信息添加到文件对象中
    
            with open('customer_shop_info', 'rb') as f1:
                count =0
                while True:
                    try:
                        shop_info = pickle.load(f1)  # 一个顾客的购物车
                        count +=1
                        print(f'{count}号顾客购买商品如下:')
                        for item in shop_info:
                            print(f'商品名称:{item.name},购买数量{item.number},商品价格:{item.price},共计消费{item.number * item.price}')
                    except EOFError:
                        break
    
        #退出会显客所购商品信息
        def exit(self):
            print('购买商品如下》》》:')
            #shopping_car = [{'iphone':12},{'ipad':9},{'ipone':11}]
            for googs in self.shopping_car:
                print(googs)
    
            # for index, item in enumerate(self.shopping_car, 1):
            #     print(f'商品序号:{index},商品名称:{item[0]},购买数量:{item[1]}')
            self.salary_all_money = self.salary_all_money - self.shopping_money
            print(f'共计消费:{self.shopping_money}')
    
            print(self.shopping_car)
            self.show_shop_info()
            #
            # self.save_googs()
            exit('欢迎下次光临......')
    
    
    
    def login():
        name = input('请输入用户名: ')
        pwd = input('请输入密码: ')
        with open('userinfo',encoding = 'utf-8')as f:
            while True:
                try:
                    for line in f:
                        user,pawd,identify = line.strip().split("|")
    
                        if user == name and pawd == pwd:
                            return {'name':name,'result':True,'id':identify}
                    else:
                        return {'result':False,'name':name,'id':identify}
                except EOFError:
                    break
    
    res = login()
    if res['result']:
        print(f"{res['name']}登录成功")
        if hasattr(sys.modules[__name__],res['id']):
            cls = getattr(sys.modules[__name__],res['id'])
            print(res['id'])
            if cls == Admin:
                obj = Admin(res['name'])
                while  True:#管理员对象可以循环选择进行操作
                    #循环列举中管理员具有的方法
                    for index,item in enumerate(obj.opt_list,1):
                        print(index,item[0])
                    func_str = obj.opt_list[int(input('请输入你选择的序号: '))-1][1]
                    if hasattr(obj,func_str):
                        getattr(obj,func_str)()
            elif cls == Customer:
                for item in os.listdir(project_dir):
                    if item == 'goods_list_info':
                        salary_all_money = float(input('请输入工资总额: '))
                        obj  = Customer(salary_all_money)
                        while True:
                            for index, item in enumerate(obj.opt_list, 1):
                                print(index, item[0])
                            func_str = obj.opt_list[int(input('请输入你选择的序号: ')) - 1][1]
                            print(func_str)
                            if hasattr(obj, func_str):
                                getattr(obj, func_str)()
                else:
                    print('商品列表为空,请先以管理员身份登录创建商品。')
    else:
        print(f'{res["name"]}登录失败')
    
    
    
    
  • 相关阅读:
    HTML <input> 标签
    HTML5 <input> type 属性
    静态页面与动态页面
    string::size_type 页73 size_t 页90
    template method(模板方法)
    C++中创建对象的时候加括号和不加括号的区别(转)
    _declspec(dllexport)和.def(转)
    智能指针
    C++中的delete加深认识
    工厂方法(整理自李建忠<C++设计模式>视频)
  • 原文地址:https://www.cnblogs.com/lihuafeng/p/14135845.html
Copyright © 2011-2022 走看看