首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python 策略模式

python 策略模式

作者头像
用户5760343
发布2019-08-02 11:04:04
发布2019-08-02 11:04:04
44200
代码可运行
举报
文章被收录于专栏:sktjsktj
运行总次数:0
代码可运行

strategy_best.py

Strategy pattern -- function-based implementation

selecting best promotion from static list of functions

""" >>> joe = Customer('John Doe', 0) >>> ann = Customer('Ann Smith', 1100) >>> cart = [LineItem('banana', 4, .5), ... LineItem('apple', 10, 1.5), ... LineItem('watermellon', 5, 5.0)] >>> Order(joe, cart, fidelity_promo) <Order total: 42.00 due: 42.00> >>> Order(ann, cart, fidelity_promo) <Order total: 42.00 due: 39.90> >>> banana_cart = [LineItem('banana', 30, .5), ... LineItem('apple', 10, 1.5)] >>> Order(joe, banana_cart, bulk_item_promo) <Order total: 30.00 due: 28.50> >>> long_order = [LineItem(str(item_code), 1, 1.0) ... for item_code in range(10)] >>> Order(joe, long_order, large_order_promo) <Order total: 10.00 due: 9.30> >>> Order(joe, cart, large_order_promo) <Order total: 42.00 due: 42.00>

BEGIN STRATEGY_BEST_TESTS

代码语言:javascript
代码运行次数:0
运行
复制
>>> Order(joe, long_order, best_promo)  # <1>
<Order total: 10.00 due: 9.30>
>>> Order(joe, banana_cart, best_promo)  # <2>
<Order total: 30.00 due: 28.50>
>>> Order(ann, cart, best_promo)  # <3>
<Order total: 42.00 due: 39.90>

END STRATEGY_BEST_TESTS

"""

from collections import namedtuple

Customer = namedtuple('Customer', 'name fidelity')

class LineItem:

代码语言:javascript
代码运行次数:0
运行
复制
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: # the Context

代码语言:javascript
代码运行次数:0
运行
复制
def __init__(self, customer, cart, promotion=None):
    self.customer = customer
    self.cart = list(cart)
    self.promotion = promotion

def total(self):
    if not hasattr(self, '__total'):
        self.__total = sum(item.total() for item in self.cart)
    return self.__total

def due(self):
    if self.promotion is None:
        discount = 0
    else:
        discount = self.promotion(self)
    return self.total() - discount

def __repr__(self):
    fmt = '<Order total: {:.2f} due: {:.2f}>'
    return fmt.format(self.total(), self.due())

def fidelity_promo(order): """5% discount for customers with 1000 or more fidelity points""" return order.total() * .05 if order.customer.fidelity >= 1000 else 0

def bulk_item_promo(order): """10% discount for each LineItem with 20 or more units""" discount = 0 for item in order.cart: if item.quantity >= 20: discount += item.total() * .1 return discount

def large_order_promo(order): """7% discount for orders with 10 or more distinct items""" distinct_items = {item.product for item in order.cart} if len(distinct_items) >= 10: return order.total() * .07 return 0

BEGIN STRATEGY_BEST

promos = [globals()[name] for name in globals() if name.endswith('_promo') and name != 'best_promo'] def best_promo(order): # <2> """Select best discount available """ return max(promo(order) for promo in promos) # <3>

END STRATEGY_BEST

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • strategy_best.py
  • Strategy pattern -- function-based implementation
  • selecting best promotion from static list of functions
  • BEGIN STRATEGY_BEST_TESTS
  • END STRATEGY_BEST_TESTS
  • BEGIN STRATEGY_BEST
  • END STRATEGY_BEST
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档