装饰器—购物打折

from collections import namedtuple# 定义促销策略列表
promos = []# 装饰器函数,用于注册促销策略
def promotion(promo_func):promos.append(promo_func)return promo_func# 促销策略1:忠诚度积分折扣
@promotion
def fidelity(order):"""为积分为1000或以上的顾客提供5%折扣"""return order.total() * .05 if order.customer.fidelity >= 1000 else 0# 促销策略2:大批量商品折扣
@promotion
def bulk_item(order):"""单个商品数量达到20个或以上时提供10%折扣"""discount = 0for item in order.cart:if item.quantity >= 20:discount += item.total() * .1return discount# 促销策略3:大量不同商品折扣
@promotion
def large_order(order):"""订单中的不同商品达到10个或以上时提供7%折扣"""distinct_items = {item.product for item in order.cart}if len(distinct_items) >= 2:return order.total() * .07return 0# 选择最佳促销策略
def best_promo(order):"""选择可用的最佳折扣"""return max(promo(order) for promo in promos)# 促销策略函数list:promos, 循环这个list, 就相当于把所有的优惠算了一遍。promo==fidelity,large_order,bulk_item# 商品项类
class LineItem:def __init__(self, product, quantity, price):self.product = product  # 商品名称self.quantity = quantity  # 商品数量self.price = price  # 商品价格def total(self):return self.price * self.quantity# 订单类
class Order:def __init__(self, customer, cart, promotions=None):self.customer = customer  # 客户信息self.cart = list(cart)  # 商品信息的对象列表# [<__main__.LineItem object at 0x0000023A397EA160>, <__main__.LineItem object at 0x0000023A397EA040>, <__main__.LineItem object at 0x0000023A397EA0A0>]self.promotion = promotionsself.__total = None  # 用于缓存总金额def total(self):if self.__total is None:  # 如果没有缓存,则计算总金额self.__total = sum(item.total() for item in self.cart)return self.__total# 客户具名元组
Customer = namedtuple('Customer', ["name", "fidelity"])  # namedtuple(classname, 参数)# 创建客户实例
joe = Customer('John Doe', 1000)  # 积分为1000# 创建购物车
joe_cart = [LineItem('banana', 5, 5.0),   # 香蕉: 4个, 单价5.0LineItem('apple', 21, 1.5),   # 苹果: 10个, 单价1.5LineItem('watermelon', 5, 5.0)  # 西瓜: 5个, 单价5.0
]# 创建订单
joe_order = Order(joe, joe_cart)# 打印最佳促销折扣
print("Best Promo Discount:", best_promo(joe_order))'''
运行逻辑解释:
促销策略注册:
使用promotion装饰器将不同的促销策略函数添加到promos列表中。
fidelity策略为忠诚度积分大于等于1000的客户提供5%的折扣。
bulk_item策略为单个商品数量达到20个或以上的商品提供10%的折扣。
large_order策略为订单中的不同商品种类达到10种或以上的订单提供7%的折扣。
创建订单:
使用LineItem类创建购物车中的商品项。
使用Order类创建一个订单,包含客户信息和购物车内容。
计算最佳折扣:
best_promo函数通过遍历promos列表中的每个促销策略,并计算每个策略对当前订单的折扣金额。
最后返回最大折扣值
'''

如何判断哪些商品可以一起购买?

要判断哪些商品可以一起购买,通常需要考虑一些特定的业务规则或限制条件。这些规则可能包括但不限于:

  1. 库存限制:某些商品可能有库存限制,如果库存不足,则不能添加到购物车。
  2. 捆绑销售:有些商品可能只能与其他特定商品一起购买(例如买A送B)。
  3. 互斥商品:某些商品之间可能存在互斥关系,即不能同时购买(例如,两个竞品商品)。
  4. 数量限制:对单个商品或整个订单的数量可能有限制。
  5. 类别限制:某些商品可能属于同一类别,但有购买数量或金额的限制。

为了实现这些逻辑,您可以在Order类中添加一个方法来检查商品是否可以添加到购物车,并在add_item方法中调用这个检查方法。下面是一个示例,展示了如何实现库存检查和互斥商品检查:

from collections import namedtuple# 假设的商品库存
inventory = {'banana': 10,'apple': 20,'watermelon': 5,
}# 互斥商品列表
mutually_exclusive_items = [{'banana', 'apple'},  # 香蕉和苹果不能同时购买
]# 定义促销策略列表
promos = []# 装饰器函数,用于注册促销策略
def promotion(promo_func):promos.append(promo_func)return promo_func# 促销策略1:忠诚度积分折扣
@promotion
def fidelity(order):"""为积分为1000或以上的顾客提供5%折扣"""return order.total() * .05 if order.customer.fidelity >= 1000 else 0# 促销策略2:大批量商品折扣
@promotion
def bulk_item(order):"""单个商品数量达到20个或以上时提供10%折扣"""discount = 0for item in order.cart:if item.quantity >= 20:discount += item.total() * .1return discount# 促销策略3:大量不同商品折扣
@promotion
def large_order(order):"""订单中的不同商品达到10个或以上时提供7%折扣"""distinct_items = {item.product for item in order.cart}if len(distinct_items) >= 10:return order.total() * .07return 0# 选择最佳促销策略
def best_promo(order):"""选择可用的最佳折扣"""return max(promo(order) for promo in promos)# 商品项类
class LineItem:def __init__(self, product, quantity, price):self.product = productself.quantity = quantityself.price = pricedef total(self):return self.price * self.quantity# 订单类
class Order:def __init__(self, customer, cart=None, promotions=None):self.customer = customerself.promotion = promotionsself.__total = None  # 用于缓存总金额self.cart = cart if cart is not None else []  # 初始化购物车为空列表或传入的购物车def total(self):if self.__total is None:  # 如果没有缓存,则计算总金额self.__total = sum(item.total() for item in self.cart)return self.__totaldef add_item(self, product, quantity, price):"""向购物车中添加商品,首先进行检查"""if not self.can_add_item(product, quantity):print(f"Cannot add {product} to the cart.")returnself.cart.append(LineItem(product, quantity, price))self.__total = None  # 清除缓存,因为购物车内容已改变def remove_item(self, product):"""从购物车中移除指定的商品"""self.cart = [item for item in self.cart if item.product != product]self.__total = None  # 清除缓存,因为购物车内容已改变def can_add_item(self, product, quantity):"""检查商品是否可以添加到购物车"""# 检查库存if inventory.get(product, 0) < quantity:print(f"Insufficient stock for {product}.")return False# 检查互斥商品for exclusive_group in mutually_exclusive_items:if product in exclusive_group:for item in self.cart:if item.product in exclusive_group and item.product != product:print(f"{product} is mutually exclusive with {item.product}.")return Falsereturn True# 客户具名元组
Customer = namedtuple('Customer', 'name fidelity')# 创建客户实例
joe = Customer('John Doe', 1000)  # 积分为1000# 创建空的购物车
joe_cart = []# 创建订单
joe_order = Order(joe, joe_cart)# 尝试添加商品
joe_order.add_item('banana', 4, 5.0)   # 香蕉: 4个, 单价5.0
joe_order.add_item('apple', 10, 1.5)   # 苹果: 10个, 单价1.5
joe_order.add_item('watermelon', 5, 5.0)  # 西瓜: 5个, 单价5.0# 打印订单总金额
print("Order Total:", joe_order.total())  # 输出订单总金额# 从购物车中移除商品
joe_order.remove_item('apple')  # 移除苹果# 再次打印订单总金额
print("Updated Order Total:", joe_order.total())  # 输出更新后的订单总金额# 打印最佳促销折扣
print("Best Promo Discount:", best_promo(joe_order))  # 应该输出基于忠诚度积分的5%折扣'''
运行逻辑解释:
库存检查:在 can_add_item 方法中,首先检查商品的库存是否足够。如果库存不足,则不允许添加商品。
互斥商品检查:接着检查商品是否与购物车中已有的商品存在互斥关系。如果存在互斥关系,则不允许添加商品。
添加商品:如果通过了所有检查,则将商品添加到购物车中,并清除总金额的缓存。
示例运行
假设我们尝试添加以下商品:香蕉: 4个, 单价5.0元
苹果: 10个, 单价1.5元
西瓜: 5个, 单价5.0元
由于香蕉和苹果是互斥商品,所以当尝试添加苹果时,会输出错误信息并阻止添加。如果库存充足且没有互斥关系,商品将被成功添加到购物车中。
这样,您就可以根据具体的业务规则来判断哪些商品可以一起购买。如果有更多的规则,可以在 can_add_item 方法中继续扩展相应的检查逻辑。
'''

如何优化购物车中商品的库存?

'''
优化购物车中商品的库存管理涉及到多个方面,包括减少库存占用、提高库存周转率、确保库存数据的准确性等。以下是一些具体的策略和方法来优化购物车中的商品库存:1. 实时库存更新
实时同步:确保在用户添加或移除商品时,立即更新库存系统。这可以通过数据库事务或消息队列来实现。
乐观锁/悲观锁:使用数据库的锁定机制来防止并发操作导致的库存错误。
2. 库存预测与补货
销售预测:基于历史销售数据和市场趋势进行销售预测,合理安排补货计划。
安全库存:设置合理的安全库存水平,以应对突发需求或供应链中断。
自动补货系统:利用自动化工具监控库存水平,并在达到预设阈值时自动触发补货流程。
3. 库存分配策略
优先级分配:根据商品的重要性和销售情况设定不同的优先级,优先满足高优先级商品的需求。
多仓库管理:如果有多仓库,可以根据地理位置、成本等因素智能分配库存。
4. 减少过期和滞销商品
定期盘点:定期进行库存盘点,及时发现并处理过期或滞销商品。
促销活动:通过促销活动加速滞销商品的销售。
退货管理:优化退货流程,减少因退货导致的额外库存。
5. 提高库存数据准确性
条形码/RFID技术:使用条形码或RFID标签来追踪商品,提高库存数据的准确性。
库存审计:定期进行库存审计,确保实际库存与记录一致。
6. 用户体验优化
库存透明度:向用户提供准确的库存信息,避免下单后发现无货的情况。
预订功能:对于缺货商品提供预订功能,收集用户需求,以便后续补货。
7. 技术实现
微服务架构:将库存管理系统设计为独立的微服务,便于扩展和维护。
API接口:提供标准的API接口,方便其他系统(如订单系统、前端应用)调用库存数据。
云服务:利用云计算资源,实现弹性伸缩,保证高峰时段的性能。
'''
from collections import namedtuple
class Inventory:def __init__(self, stock):self.stock = stockdef check_stock(self, product, quantity):"""检查库存是否足够"""return self.stock.get(product, 0) >= quantitydef update_stock(self, product, quantity, action='subtract'):"""更新库存,可以是增加或减少"""if action == 'subtract':self.stock[product] -= quantityelif action == 'add':self.stock[product] += quantity# 假设的商品库存
inventory = Inventory({'banana': 10,'apple': 20,'watermelon': 5,
})# 商品项类
class LineItem:def __init__(self, product, quantity, price):self.product = productself.quantity = quantityself.price = pricedef total(self):return self.price * self.quantity# 订单类
class Order:def __init__(self, customer, cart=None, promotions=None, inventory=None):self.customer = customerself.promotion = promotionsself.__total = None  # 用于缓存总金额self.cart = cart if cart is not None else []  # 初始化购物车为空列表或传入的购物车self.inventory = inventory  # 库存管理对象def total(self):if self.__total is None:  # 如果没有缓存,则计算总金额self.__total = sum(item.total() for item in self.cart)return self.__totaldef add_item(self, product, quantity, price):"""向购物车中添加商品,首先进行检查"""if not self.inventory.check_stock(product, quantity):print(f"Insufficient stock for {product}.")returnself.cart.append(LineItem(product, quantity, price))self.inventory.update_stock(product, quantity, 'subtract')self.__total = None  # 清除缓存,因为购物车内容已改变def remove_item(self, product):"""从购物车中移除指定的商品,并恢复库存"""removed_items = [item for item in self.cart if item.product == product]for item in removed_items:self.inventory.update_stock(item.product, item.quantity, 'add')self.cart.remove(item)self.__total = None  # 清除缓存,因为购物车内容已改变# 客户具名元组
Customer = namedtuple('Customer', 'name fidelity')# 创建客户实例
joe = Customer('John Doe', 1000)  # 积分为1000# 创建空的购物车
joe_cart = []# 创建订单
joe_order = Order(joe, joe_cart, inventory=inventory)# 尝试添加商品
joe_order.add_item('banana', 4, 5.0)   # 香蕉: 4个, 单价5.0
joe_order.add_item('apple', 10, 1.5)   # 苹果: 10个, 单价1.5
joe_order.add_item('watermelon', 5, 5.0)  # 西瓜: 5个, 单价5.0# 打印订单总金额
print("Order Total:", joe_order.total())  # 输出订单总金额# 从购物车中移除商品
joe_order.remove_item('apple')  # 移除苹果# 再次打印订单总金额
print("Updated Order Total:", joe_order.total())  # 输出更新后的订单总金额# 打印当前库存
print("Current Inventory:", inventory.stock)'''
运行逻辑解释:
库存检查:在 add_item 方法中,首先通过 check_stock 方法检查库存是否足够。如果库存不足,则不允许添加商品。
库存更新:当商品被成功添加到购物车时,调用 update_stock 方法减少相应商品的库存。
恢复库存:在 remove_item 方法中,当商品从购物车中移除时,调用 update_stock 方法恢复相应商品的库存。
通过这些步骤,您可以确保库存数据的实时性和准确性,从而更好地管理购物车中的商品库存。此外,还可以结合上述提到的其他策略和技术手段,进一步优化库存管理。
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483434.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Matlab BP神经网络的电力负荷预测模型研究与实现

随着电力系统的复杂性和规模的不断增长&#xff0c;准确的电力负荷预测对于电网的稳定性和运行效率至关重要。传统的负荷预测方法依赖于历史数据和简单的统计模型&#xff0c;但这些方法在处理非线性和动态变化的负荷数据时&#xff0c;表现出较大的局限性。近年来&#xff0c;…

非标自动化行业ERP选型与案例展示!

非标自动化行业&#xff0c;那么使用的就是非标设备&#xff0c;什么是非标设备呢?用一句话来说明就是指设计制造方面没有形成国家标准的设备。 在如今追求高效的社会&#xff0c;各行各业都朝着提高效率精益工艺&#xff0c;缩减流程&#xff0c;调整业务&#xff0c;用各种…

十、软件设计架构-微服务-服务调用Dubbo

文章目录 前言一、Dubbo介绍1. 什么是Dubbo 二、实现1. 提供统一业务api2. 提供服务提供者3. 提供服务消费者 前言 服务调用方案--Dubbo‌ 基于 Java 的高性能 RPC分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;以及SOA服务治理方案。…

【AI系统】CANN 算子类型

CANN 算子类型 算子是编程和数学中的重要概念&#xff0c;它们是用于执行特定操作的符号或函数&#xff0c;以便处理输入值并生成输出值。本文将会介绍 CANN 算子类型及其在 AI 编程和神经网络中的应用&#xff0c;以及华为 CANN 算子在 AI CPU 的详细架构和开发要求。 算子基…

uniapp使用扩展组件uni-data-select出现的问题汇总

前言 不知道大家有没有学习过我的这门课程那&#xff0c;《uniCloud云开发Vue3版本官方推荐用法》&#xff0c;这么课程已经得到了官方推荐&#xff0c;想要快速上手unicloud的小伙伴们&#xff0c;可以学习一下这么课程哦&#xff0c;不要忘了给一键三连呀。 在录制这门课程…

TypeScript和JavaScript区别详解

文章目录 TypeScript和JavaScript区别详解一、引言二、类型系统1、静态类型检查TypeScript 示例JavaScript 示例 2、类型推断TypeScript 示例JavaScript 示例 三、面向对象编程TypeScript 示例JavaScript 示例 四、使用示例1. 环境搭建2. 创建TypeScript项目3. 安装TypeScript插…

前端开发 之 15个页面加载特效上【附完整源码】

文章目录 一&#xff1a;彩球环绕加载特效1.效果展示2.HTML完整代码 二&#xff1a;跷跷板加载特效1.效果展示2.HTML完整代码 三&#xff1a;两个圆形加载特效1.效果展示2.HTML完整代码 四&#xff1a;半环加载特效1.效果展示2.HTML完整代码 五&#xff1a;音乐波动加载特效1.效…

基于C#+SQLite开发数据库应用的示例

SQLite数据库&#xff0c;小巧但功能强大&#xff1b;并且是基于文件型的数据库&#xff0c;驱动库就是一个dll文件&#xff0c;有些开发工具 甚至不需要带这个dll&#xff0c;比如用Delphi开发&#xff0c;用一些三方组件&#xff1b;数据库也是一个文件&#xff0c;虽然是个文…

生态环境一体化智慧监管平台

在数字化和智能化的浪潮中&#xff0c;生态环境保护与治理正迎来革命性的变化。生态环境一体化智慧监管平台的建设&#xff0c;不仅响应了这一趋势&#xff0c;而且为中国式现代化的生态治理提供了新的解决方案。本文将深度分析该平台的建设内容&#xff0c;探讨其在推动生态文…

3.4 朴素贝叶斯算法

3.4 朴素贝叶斯算法 朴素&#xff1f; 假设&#xff1a;特征与特征之间是相互独立的 应用&#xff1a;文本分类&#xff0c;单词作为特征 3.4.1 什么是朴素贝叶斯算法 朴素贝叶斯&#xff08;Naive Bayes&#xff09;是一种基于贝叶斯定理的简单概率分类器&#xff0c;它假…

使用Mybatis-Plus时遇到的报错问题及解决方案

创建Maven项目后&#xff0c;一个个手动添加spring-boot和mybatis-plus依赖冲突问题 解决方案&#xff1a;找一个现成的pom.xml文件替换后重新加载&#xff08;以下提供java8&#xff0c;对应的spring-boot,mybatis-plus依赖&#xff09; <?xml version"1.0" en…

VSCode如何关闭Vite项目本地自启动

某些情况下VSCode打开Vite项目不需要自动启动&#xff0c;那么如何关闭该功能 文件>首选项>设置 搜索vite 将Vite:Auto Start 勾选取消即可

物联网——WatchDog(监听器)

看门狗简介 独立看门狗框图 看门狗原理&#xff1a;定时器溢出&#xff0c;产生系统复位信号&#xff1b;若定时‘喂狗’则不产生系统复位信号 定时中断基本结构&#xff08;对比&#xff09; IWDG键寄存器 独立看门狗超时时间 WWDG(窗口看门狗) WWDG特性 WWDG超时时间 由于…

在办公室环境中用HMD替代传统显示器的优势

VR头戴式显示器&#xff08;HMD&#xff09;是进入虚拟现实环境的一把钥匙&#xff0c;拥有HMD的您将能够在虚拟现实世界中尽情探索未知领域&#xff0c;正如如今的互联网一样&#xff0c;虚拟现实环境能够为您提供现实中无法实现的或不可能实现的事。随着技术的不断进步&#…

黑马2024AI+JavaWeb开发入门Day04-SpringBootWeb入门-HTTP协议-分层解耦-IOCDI飞书作业

视频地址&#xff1a;哔哩哔哩 讲义作业飞书地址&#xff1a;day04作业&#xff08;IOC&DI&#xff09; 作业很简单&#xff0c;主要是练习拆分为三层架构controller、service、dao&#xff0c;并基于IOC & DI进行解耦。 1、结构&#xff1a; 2、代码 网盘链接&…

【iOS】多线程基础

【iOS】多线程基础 文章目录 【iOS】多线程基础前言进程与线程进程进程的状态进程的一个控制结构进程的上下文切换 线程为什么要用线程什么是线程线程和进程的关系线程的上下文切换 线程和进程的优缺点 小结 前言 笔者由于对于GCD不是很了解&#xff0c;导致了项目中网络请求哪…

Android矩阵Matrix在1张宽平大Bitmap批量绘制N个小Bitmap,Kotlin(1)

Android矩阵Matrix在1张宽平大Bitmap批量绘制N个小Bitmap&#xff0c;Kotlin&#xff08;1&#xff09; import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Color import android.graphics.Matri…

vue2+svg+elementui实现花瓣图自定义el-select回显色卡图片

项目需要实现花瓣图&#xff0c;但是改图表在echarts&#xff0c;highCharts等案例中均未出现&#xff0c;有类似的韦恩图&#xff0c;但是和需求有所差距&#xff1b; 为实现该效果&#xff0c;静态图表上采取svg来手动绘制花瓣&#xff1a; 确定中心点&#xff0c;以该点为中…

二百七十八、ClickHouse——将本月第一天所在的那一周视为第一周,无论它是从周几开始的,查询某个日期是本月第几周

一、目的 ClickHouse指标表中有个字段week_of_month&#xff0c;含义是这条数据属于本月第几周。 而且将本月第一天所在的那一周视为第一周&#xff0c;无论它是从周几开始的。比如2024-12-01是周日&#xff0c;即12月第一周。而2024-12-02是周一&#xff0c;即12月第二周 二…

快充协议IC支持全协议,内部集成LDO支持输出电压3.3V,支持宽电压范围3.3~30V

随着快充技术的不断发展&#xff0c;越来越多的电子产品都使用上了快充&#xff0c;市面上大多数受电端取电芯片只有取电功能&#xff0c;而有些产品则需要更多功能支持&#xff0c;例如产品需要快充支持又要读取电压&#xff0c;就只能在使用取电协议芯片的同时再增加一颗串口…