Fluent_Python_Part3函数即对象,06-dp-1class-func,一等函数与设计模式
使用一等函数实现设计模式
中文电子书P278
合理利用作为一等对象的函数,把模式中涉及的某些类的实例替换成简单的函数,从而简化代码。
1. 重构“策略”模式
- 中文电子书P282
- Python3.0-3.3中,声明抽象基类要使用metaclass=关键字:class Promotion(metaclass=ABCMeta)。在Python3.4中,最简单的方法是子类化abc.ABC。
from abc import ABC, abstractmethod
class Promotion(ABC):
@abstractmethod
def discount(self, order):
""""""
3. 具体策略用Order类实现,且有Promotion抽象基类
- 中文电子书P282,促销事例。
4. 具体策略用简单的函数替换,并且去掉Promotion抽象基类
- 原因:每个具体策略都是一个类,但只定义了一个方法,且没有实例属性(状态)。他们看起来是普通的函数。
- 中文电子书P285。
5. 寻找最优折扣额度
- 方法1. hardcode,写死在一个列表里,缺点是新增具体折扣策略要手动添加。
promos = [promo1, promo2, promo3]
def best_promo(order):
"""选择最佳折扣"""
return max(promo(order) for promo in promos)
- 方法2. 用内置函数globals()找出模块中的全部策略。
#globals()以字典形式返回的是当前的全局符号表。globals()[name]返回的是方法的地址addr, 即globals()[name]()可以调用函数。
#过滤掉best_promo自身,防止无限递归。
promos = [globals()[name] for name in globals() if name.endswith('_promo') and name != 'best_promo']
- 方法3. 在一个单独的模块中保存所有策略函数,把best_promo排除在外
#用inspect模块内省promotions模块
import inspect
import promotions
#inspect.getmembers()返回的是元列表,如下所示
'''[('a_pro', <function a_pro at 0x7fec13d3d840>), ('b_pro', <function b_pro at 0x7fec13d3d8c8>), ('c_pro', <function c_pro at 0x7fec13d3d950>)]'''
promos = [func for name, func in inspect.getmembers(promotions, inspect.isfunction)]
但是这个例子是在promotions模块里都是包含能计算折扣的函数的假设上进行的。不是一个完善的方案,而是inspect(内省)的一种用途。
- 第7章会使用函数装饰器去实现这个电商“策略”模式示例。
6. 命令模式通常也用单方法类实现,同样也可以换成普通的函数(或者可调用对象)。
中文电子书P292
7. 模式或API可以使用一等函数或可调用对象实现,减少样板代码。
8. 设计模式与语言特性无法精确对应。
23个经典的设计模式很好用Java实现,不意味着所有模式都能一成不变地在所有语言中使用。
Fluent_Python_Part3函数即对象,06-dp-1class-func,一等函数与设计模式的更多相关文章
- 《流畅的Python》第三部分 把函数视作对象 【一等函数】【使用一等函数实现设计模式】【函数装饰器和闭包】
第三部分 第5章 一等函数 一等对象 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传递给函数 能作为函数的返回结果 在Python中,所有函数都是一等对象 函数是对象 函数本身是 func ...
- JavaScript-- 函数既是函数又是对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JavaScript基本语法(函数与对象)
3.函数 #①内置函数 内置函数:系统已经声明好了可以直接使用的函数. #[1]弹出警告框 alert("警告框内容"); #[2]弹出确认框 用户点击『确定』返回true,点 ...
- Fluent_Python_Part3函数即对象,05-1class-func,一等函数,函数即对象
一等函数 一等函数即将函数看作一等对象.一等对象满足一下条件: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 1. 一等函数 例子1. 证明function是 ...
- Fluent_Python_Part3函数即对象,07-closure-decoration,闭包与装饰器
第7章 函数装饰器和闭包 装饰器用于在源码中"标记"函数,动态地增强函数的行为. 了解装饰器前提是理解闭包. 闭包除了在装饰器中有用以外,还是回调式编程和函数式编程风格的基础. 1 ...
- JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- 详细解读-this-关键字在全局、函数、对象、jQuery中的基础用法!
一.前言 1. Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的设计模式来实现面向对象的编程,其 ...
- 详细解读-this-关键字在全局、函数、对象、jQuery等中的基础用法!
一.前言 1. Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的设计模式来实现面向对象的编程,其 ...
随机推荐
- mybatis - @MapperScan
一. 测试代码 //实体类 public class User { private Integer id; private String name; private Integer age; priv ...
- 使用imread()函数读取图片的六种正确姿势
OpenCV实践之路——使用imread()函数读取图片的六种正确姿势 opencv里的argv[1]指向的文件在哪里 测试 #include "opencv2/highgui/highgu ...
- jvm(6):JMM
typora-root-url: ./ CPU多核并发缓存架构 JMM(Java线程内存模型)底层实现原理 基于CPU缓存模型建立的,屏蔽掉了底层不同计算机的区别. 所有的共享变量都存储在主内存.每条 ...
- spring(四):IoC初始化流程&BeanDefinition加载注册
ApplicationContext context = new ClassPathXmlApplicationContext("hello.xml"); /** * * @par ...
- 在Linux系统下安装jdk并配置环境变量
本文主要介绍的是如何是Linux环境下安装JDK的,因为Linux环境下,很多时候也离不开Java的,下面笔者就和大家一起分享如何jdk1.8的过程吧. 1.安装环境 操作系统:CentOS 07 6 ...
- NOIP做题练习(day5)
A - 中位数图 题面 题解 先找出题意中的\(b\)所在的位置. 再以这个位置为中心,向右\(for\)一遍有多少个大于/小于该数的数 大于就\(++cs\) 小于就\(--cs\). 因为这个数是 ...
- $ ssh -T -v git@github.com_在本地用ssh连接github出错_git@github.com: Permission denied (publickey).
$ ssh -T -v git@github.com报错: debug1: Authentications that can continue: publickey debug1: Next auth ...
- JS 每次进入自动加载JS
对于动态文件,比如 index.asp?id=... 或者 index.aspx?id=... 相信有经验的程序员都知道怎样禁止浏览器缓存数据了.但是对于静态文件(css,jpg,gif等等), 在什 ...
- 《你一生的故事》--------------science fiction-------------《巴比伦塔》
而塔就不一样了,不等你靠近去触摸它,就已经感到一种纯粹的坚固与力量.所有的传说都认为,建造这座塔的目的,是为了获得一种力量,这种力量是任何一座巴比伦庙塔都未曾拥有的.普通的巴比伦塔只是用太阳晒干的泥砖 ...
- 问题总结:mysql和javaweb工程连接的过程中容易产生的问题
问题背景:自己在本机的mysql8瘫痪了,将Oracle中的数据迁移到mysql之后,配置好javaweb工程和虚拟机上的远程Mysql连接的文件之后:遇见了无法访问的问题 具体的配置: dataso ...