面向对象的购物车ver1.0


userinfo文件内存放管理员和顾客登录账户
jack|222|Admin
mary|111|Customer


#!/usr/bin/env python 
# -*- coding:utf-8 -*-
# 开发团队: 奶豆的小铺
# 开发人员: bcz
# 开发时间: 2020/12/8 19:58

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,num):
        self.name = name
        self.price = price
        self.num = num

    def __str__(self):
        return self.name



#商店管理员
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 create_customer(self):
        '''创建顾客'''
        pass


    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.num}')
                except EOFError:
                    print('还没有商品,请先添加商品')
                    break





    def show_customer_goods(self):
        '''查看顾客购买商品情况'''


    def exit(self):
        exit('欢迎下次使用')



#顾客类
class Customer():

    opt_list = [("购买商品", 'select_goods'),
                ("退商品", 'return_goods'),
                ('退出', 'exit')
                ]

    def __init__(self, salary_all_money):
        self.salary_all_money = salary_all_money
        self.shopping_car = []



    #购买商品
    def select_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.num}')
                except EOFError:
                    break
        number_goods = int(input('请输入你选择的商品的序号:  '))
        num_goods = int(input('请输入购买该商品的数量: '))
        with open('goods_list_info', 'rb') as f:
            count1 = 0
            while True:
                try:
                    count1 += 1
                    goods_obj = pickle.load(f)
                    goods_obj.shop_num = 0
                    if count1 == number_goods:#选中该商品
                        if num_goods <=goods_obj.num and goods_obj.price* num_goods<=self.salary_all_money:
                            #如果购物车为空
                            if len(self.shopping_car) == 0:
                                goods_obj.shop_num = num_goods
                                self.shopping_car.append([goods_obj.name,goods_obj.shop_num,goods_obj.price])

                            else:
                                for item in self.shopping_car:
                                    if goods_obj.name == item[0]:
                                        self.shopping_car.remove(item)
                                        goods_obj.shop_num = item[1]
                                        goods_obj.shop_num += num_goods
                                        self.shopping_car.append([goods_obj.name,goods_obj.shop_num,goods_obj.price])
                                        break

                                    else:
                                        goods_obj.shop_num = num_goods
                                        self.shopping_car.append([goods_obj.name,goods_obj.shop_num,goods_obj.price])
                                        break
                            print(self.shopping_car)
                            print(f'购买数量{goods_obj.shop_num}')
                            print(f'您选择了{goods_obj.name}商品,购买了{goods_obj.shop_num}个')
                            break  # 选定了商品就可以直接退出了
                        else:
                            print('该商品没有那么多')
                except EOFError:
                # print('还没有商品,请先添加商品')
                    break




    def return_goods(self):
        '''退商品'''

        # #循环自己的购物车,选择自己想退的商品然后从新pickle商品清单
        goods_name_return = input('请输入你想退的商品名称: ')
        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 exit(self):
        print('购买商品如下》》》:')
        #shopping_car = [{'iphone':12},{'ipad':9},{'ipone':11}]
        shop_money = 0
        for index, item in enumerate(self.shopping_car, 1):
            print(f'商品序号:{index},商品名称:{item[0]},购买数量:{item[1]}')
            shop_money += item[2]*item[1]
        print(f'共计消费:{shop_money}')
        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]
                        if hasattr(obj, func_str):
                            getattr(obj, func_str)()
            else:
                print('商品列表为空,请先以管理员身份登录创建商品。')

else:
    print(f'{res["name"]}登录失败')
原文地址:https://www.cnblogs.com/lihuafeng/p/14122905.html