当前位置: 首页 > article >正文

装饰器—购物打折

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 = 0
    for item in order.cart:
        if item.quantity >= 20:
            discount += item.total() * .1

    return 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() * .07
    return 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 = promotions
        self.__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.0
    LineItem('apple', 21, 1.5),   # 苹果: 10个, 单价1.5
    LineItem('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 = 0
    for item in order.cart:
        if item.quantity >= 20:
            discount += item.total() * .1
    return 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() * .07
    return 0

# 选择最佳促销策略
def best_promo(order):
    """选择可用的最佳折扣"""
    return max(promo(order) for promo in promos)

# 商品项类
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=None, promotions=None):
        self.customer = customer
        self.promotion = promotions
        self.__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.__total

    def add_item(self, product, quantity, price):
        """向购物车中添加商品,首先进行检查"""
        if not self.can_add_item(product, quantity):
            print(f"Cannot add {product} to the cart.")
            return
        self.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 False

        return 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 = stock

    def check_stock(self, product, quantity):
        """检查库存是否足够"""
        return self.stock.get(product, 0) >= quantity

    def update_stock(self, product, quantity, action='subtract'):
        """更新库存,可以是增加或减少"""
        if action == 'subtract':
            self.stock[product] -= quantity
        elif action == 'add':
            self.stock[product] += quantity

# 假设的商品库存
inventory = Inventory({
    'banana': 10,
    'apple': 20,
    'watermelon': 5,
})

# 商品项类
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=None, promotions=None, inventory=None):
        self.customer = customer
        self.promotion = promotions
        self.__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.__total

    def add_item(self, product, quantity, price):
        """向购物车中添加商品,首先进行检查"""
        if not self.inventory.check_stock(product, quantity):
            print(f"Insufficient stock for {product}.")
            return
        self.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.kler.cn/a/427906.html

相关文章:

  • 力扣017_最小覆盖字串题解----C++
  • 栈和队列特别篇:栈和队列的经典算法问题
  • JavaScript系列(50)--编译器实现详解
  • 【Rust自学】15.1. 使用Box<T>智能指针来指向堆内存上的数据
  • java.math 包 中的 BigDecimal 类(详细案例拆解)
  • 探索AI(chatgpt、文心一言、kimi等)提示词的奥秘
  • 数据结构基础之《(11)—堆》
  • 【3D AIGC】Img-to-3D、Text-to-3D、稀疏重建(2024年文章汇总)
  • 【技术支持】关于html中移动端innerwidth的问题
  • 『MySQL 实战 45 讲』24 - MySQL是怎么保证主备一致的?
  • C++学习-类+对象+函数
  • 【oracle数据库提示oracle initialization or shutdown in process】
  • Spring完整知识点二
  • 17. Threejs案例-Three.js创建多个立方体
  • burpsuite(6)暴力破解与验证码识别绕过
  • ansible基础教程(上)
  • UE5 Compile Plugins | Rebuild from Source Manually | Unreal Engine | Tutorial
  • 如何在Ubuntu 20.04上编译安装OpenCV 4.4并启用pkg-config支持
  • 【工具变量】上市公司企业商业信用融资数据(2003-2022年)
  • LeetCode - #152 乘积最大子数组(Top 100)
  • ADB常用各模块操作命令
  • 第二部分:基础知识 5.控制流 --[JavaScript 新手村:开启编程之旅的第一步]
  • 【趋势红蓝交易】主图指标操盘技术图文展示,注意要点,通达信炒股软件指标
  • Android 按两下power键不打开相机改为打开手电筒
  • 第三周作业
  • 如何在MySQL中开启死锁日志及查看日志