使用一等函数实现设计模式
这里我们以策略模式来讲解
定义一系列算法, 把他们封装起来, 并且使他们可以相互替换, 可以使算法独立于使用它的客户而变化

主要目的就是为了让任意买家以任意 打折方案清空任意购物车三者任意结合给出最终金额

  • 购物车包括 订单数组 , 买家 , 打折方案
  1. 订单数组由一系列订单组成
  2. 买家包括买家姓名,买家积分
  3. 打折方案只有一个折扣方法, 传入购物车本身

这是购物车的类图

目录

  1. 用类实现购物车策略模式
  2. 用一等函数实现购物车的策略模式
  3. 全部策略
  4. 最佳的策略模式

1. 用类实现购物车策略模式

使用类的思路来实现

# -*- coding: utf-8 -*- from collections import namedtuple
from abc import abstractmethod# 具名元组
Customer = namedtuple('Customer', 'name, credits')class ShopCart(object):"""购物车"""def __init__(self, orders, customer, promotion):""":type promotion: Promotion:type orders: Order"""self._orders = ordersself._customer = customerself._promotion = promotion@propertydef customer(self):return self._customer@propertydef orders(self):return self._ordersdef total(self):if not hasattr(self, '_total'):self._total = sum([item.total() for item in self.orders])return self._totaldef due(self):if self._promotion:return self.total() - self._promotion.discount(self)return self.total()def __repr__(self):fmt = '<total: {:.2f} due: {:.2f}>'return fmt.format(self.total(), self.due())class Order(object):def __init__(self, production, quantity, price):self._production = productionself._quantity = quantityself._price = price@propertydef production(self):return self._production@propertydef quantity(self):return self._quantity@propertydef price(self):return self._pricedef total(self):return self.quantity * self.priceclass Promotion(object):"""折扣父类"""@abstractmethoddef discount(self, shop_cart):""":type shop_cart: ShopCart"""class GoodCustomerPromotion(Promotion):"""1000分以上5%折扣"""def __init__(self):super(GoodCustomerPromotion, self).__init__()def discount(self, shop_cart):if shop_cart.customer.credits >= 1000:return shop_cart.total() * .05return 0class SigletonProductionPromotion(Promotion):"""单个商品20个以上 10%折扣"""def __init__(self):super(SigletonProductionPromotion, self).__init__()def discount(self, shop_cart):result = 0for item in shop_cart.orders:if item.production > 20:result += (item.quantity * item.price) * 0.1return resultclass ManyDifferentProductionPromotion(Promotion):"""不同商品种类10个以上, 给予7%折扣"""def __init__(self):super(ManyDifferentProductionPromotion, self).__init__()def discount(self, shop_cart):if len(shop_cart.orders) >= 7:return shop_cart.total() * .07return 0# 三个顾客
customer_william = Customer('william', 2000)
customer_zhang = Customer('张冠举', 0)
customer_long = Customer('龙斌', 0)# 两种购物车
orders_normal = [Order('香蕉', 4, .5), Order('苹果', 10, 1.5), Order('西瓜', 5, 5.0)]
orders_sigleton= [Order('香蕉', 30, .5), Order('苹果', 10, 1.5)]
orders_different = [Order(str(i), 1, 10) for i in range(10)]print ShopCart(orders_normal, customer_zhang, GoodCustomerPromotion())
print ShopCart(orders_normal, customer_long, GoodCustomerPromotion())
print ShopCart(orders_normal, customer_william, GoodCustomerPromotion())
print ShopCart(orders_sigleton, customer_william, SigletonProductionPromotion())
print ShopCart(orders_different, customer_william, ManyDifferentProductionPromotion())

执行结果


2. 用一等函数实现购物车的策略模式

然后我们想一下, 在python种, 方法也是对象啊, 上面的那些折扣对象不就是用了一个传入ShopCart对象,返回折扣的方法吗? 那我们完全可以把这些折扣对象写成方法, 然后购物车种拿到这些方法不就行了, 如下:

# -*- coding: utf-8 -*-
from collections import namedtuple
from abc import abstractmethodCustomer = namedtuple('Customer', 'name, credits')class ShopCart(object):"""购物车"""def __init__(self, orders, customer, promotion):""":type promotion: Promotion:type orders: Order"""self._orders = ordersself._customer = customerself._promotion = promotion@propertydef customer(self):return self._customer@propertydef orders(self):return self._ordersdef total(self):if not hasattr(self, '_total'):self._total = sum([item.total() for item in self.orders])return self._totaldef due(self):if self._promotion:return self.total() - self._promotion(self)return self.total()def __repr__(self):fmt = '<total: {:.2f} due: {:.2f}>'return fmt.format(self.total(), self.due())class Order(object):def __init__(self, production, quantity, price):self._production = productionself._quantity = quantityself._price = price@propertydef production(self):return self._production@propertydef quantity(self):return self._quantity@propertydef price(self):return self._pricedef total(self):return self.quantity * self.pricedef GoodCustomerPromotion(shop_cart):"""1000分以上5%折扣"""if shop_cart.customer.credits >= 1000:return shop_cart.total() * .05return 0def SigletonProductionPromotion(shop_cart):result = 0for item in shop_cart.orders:if item.production > 20:result += (item.quantity * item.price) * 0.1return resultdef ManyDifferentProductionPromotion(shop_cart):if len(shop_cart.orders) >= 7:return shop_cart.total() * .07return 0# 三个顾客
customer_william = Customer('william', 2000)
customer_zhang = Customer('张冠举', 0)
customer_long = Customer('龙斌', 0)# 两种购物车
orders_normal = [Order('香蕉', 4, .5), Order('苹果', 10, 1.5), Order('西瓜', 5, 5.0)]
orders_sigleton= [Order('香蕉', 30, .5), Order('苹果', 10, 1.5)]
orders_different = [Order(str(i), 1, 10) for i in range(10)]print ShopCart(orders=orders_normal, customer=customer_zhang, promotion=GoodCustomerPromotion)
print ShopCart(orders=orders_normal, customer=customer_long, promotion=GoodCustomerPromotion)
print ShopCart(orders=orders_normal, customer=customer_william, promotion=GoodCustomerPromotion)
print ShopCart(orders=orders_sigleton, customer=customer_william, promotion=SigletonProductionPromotion)
print ShopCart(orders=orders_different, customer=customer_william, promotion=ManyDifferentProductionPromotion)

执行结果


3. 最佳的策略模式

然后在此基础上, 写一个最佳的策略模式

def best_promotion(shop_car):return max([promotion(shop_car) for promotion in [GoodCustomerPromotion, SigletonProductionPromotion, ManyDifferentProductionPromotion]])print ShopCart(orders=orders_normal, customer=customer_william, promotion=best_promotion)

4. 全部策略

全部策略
实际上讲的使module内部外部得到module中的属性
先说在内部得到, 可使用globals()
globals, 代表的使当前的全局符号表
可以这样写

# 找出该模块中所有的策略
all_promos = [globals()[name] for name in globals().keys() if name.endswith('Promotion')]
print all_promos

当然, 在当前的module中当然不能使用globals()来获取别的module中的属性
可以使用inspect模块, 在同目录下创建一个新的文件

import inspect
import test
pomoros = [func_name for func_name, func in inspect.getmembers(old_test_01, inspect.isfunction) if func_name.endswith('Promotion')]
print pomoros

执行结果

流畅的python第六章 使用一等函数设计模式相关推荐

  1. python归一化 增大差异_简学Python第六章__class面向对象编程与异常处理

    Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群 群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性pr ...

  2. 宇文成 Python 第六章 列表和元组

    Python 第六章 列表和元组 #!/usr/bin/python -- coding:utf-8 -- @Author : Yu Wencheng @Time : 2020/9/5 17:04 & ...

  3. 《流畅的Python第二版》读书笔记——函数作为一等对象

    引言 这是<流畅的Python第二版>抢先版的读书笔记.Python版本暂时用的是python3.10.为了使开发更简单.快捷,本文使用了JupyterLab. 函数是Python的一等( ...

  4. python第六章函数课后答案_浙大PTA-Python题库 函数题(6-1~6-6)题解

    其他各章题解链接如下 浙大PTA-Python题库 编程题第一章(1-1~1-3)题解 https://blog.csdn.net/zimuzi2019/article/details/1070206 ...

  5. 《流畅的Python第二版》读书笔记——函数中的类型注解

    引言 这是<流畅的Python第二版>抢先版的读书笔记.Python版本暂时用的是python3.10.为了使开发更简单.快捷,本文使用了JupyterLab. 本章关注于Python在函 ...

  6. python【进阶】5.一等函数(注销)

    在 Python 中,函数是一等对象.编程语言理论家把"一等对象"定义为满足下述条件的程 序实体: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返 ...

  7. 读书笔记-流畅的python(1-6章)

    前言:这正是本书的主要目的:着重讲解这门语言的基本惯用法,让你的代码简洁.高效且可读,把你打造成熟练的 Python 程序员. 自己总结学习作为输出,很多为了节省时间只是复制粘贴,不具有广泛意义 第一 ...

  8. python 第六章 函数

    1.函数的定义 def 名称(形参): 函数体 2.函数的调用 名称(实参) 单独文件:模块 调用方式--模块.名称 3.函数的参数类型 1.位置参数: def add(a,b):add(2,3) # ...

  9. python 第六章 函数 pta(1)

    1.Multiple-Choice 1.print(type(lambda:3))的输出结果是____. A.<class 'function'> B.<class 'int'> ...

  10. 流畅的python第一章_《流畅的Python》第一章学习笔记

    一摞python风格的纸牌from collections import namedtuple Card = namedtuple('Card', ['rank', 'suit']) # 构建只有少数 ...

最新文章

  1. springboot+shiro+cas实现单点登录之shiro端搭建
  2. 加快LOOP嵌套循环的一个方法
  3. Oracle11g 备份和恢复的方法
  4. android 串口调试工具_树莓派通用串口通信实验
  5. 前端学习(2742):重读vue电商网站52之路由懒加载
  6. pxe自动部署Linux,Kickstart+PXE自动部署CentOS6.6
  7. mysql备份与恢复 cat_MySQL备份和恢复具体实施
  8. 深度学习助力异常胸部 X 光片检测
  9. 高性能极致用户体验前端开发实战
  10. [转]在WPF中打开网页方法总结
  11. 软考信息系统项目管理师真题及答案之案例分析
  12. Python调用graphviz绘制结构化图形网络
  13. Vue-组件自定义事件-绑定-解绑
  14. [转载]世界各个地区WIFI 2.4G及5G信道划分表(附无线通信频率分配表)
  15. 手机数据安全成为315晚会重灾区
  16. 一款恋爱星座男女配对微信小程序源码
  17. 04_nand基本操作
  18. Too many files with unapproved license异常、使用-Drat.skip=true跳过 或者 对没有授权的文件开头添加授权
  19. 北京科技大学 计算机考研真题,北京科技大学计算机系统结构和组成原理考研真题...
  20. NVIDIA Cuda 7.5 on Ubuntu 14.04 64 bits

热门文章

  1. 数据可视化之热力图相关系数图(原理+Python代码)
  2. 《刻意练习——如何从新手到大师》——创造天才
  3. 微信公众号发红包开发教程
  4. 进制转换--2进制转16进制
  5. MHL接口的静电保护方案
  6. 图像空间域和频域的分析
  7. excel超链接无法打开服务器文件,excle链接的未打开 | excel超链接打不开,超链接后点击出现无法打开指定的文件,求高手解决...
  8. linux 命令 aft,AFT整理出来的NPC检测命令大全
  9. 环保物联网技术应用研究综述
  10. [报表篇] (11)设置印刷尺寸