Fluent Python 笔记 第 6 章 使用一等函数实现设计模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用。1996 年,Peter Norvig 在题为“Design Patterns in Dynamic Languages”(http://norvig.com/design- patterns/)的演讲中指出,Gamma 等人合著的《设计模式:可复用面向对象软件的基础》一 书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”(参见第 9 张幻灯片)。他讨论的是 Lisp 和 Dylan,不过很多相关的动态特性在 Python 中也能找到。具体而言,Norvig 建议在有一等函数的语言中重新审视“策略”“命令”“模板方法”和“访问者”模式。通常,我们可以把这些模式中涉及的某些类的实例替换成简单的函数, 从而减少样板代码。
6.1 案例分析:重构“策略”模式
6.1.1 经典的“策略”模式

6.1.2 使用函数实现“策略”模式
就是使用函数代替各种策略。函数可以直接调用,也不需要 Promotion 基类。
6.1.3 选择最佳策略:简单的方式
def best_promo(order):"""选择可用的最佳折扣"""return max(promo(order) for promo in promos)
但是有些重复可能会导致不易察觉的缺陷:若想添加新的促销策略,要定义相应的函数,还要记得把它添加到 promos 列表中。
6.1.4 找出模块中的全部策略
globals()
返回一个字典,表示当前的全局符号表。这个符号表始终针对当前模块(对函数或方法 来说,是指定义它们的模块,而不是调用它们的模块)。
inspect.getmembers 函数用于获取对象(这里是 promotions 模块)的属性,第二个参数是可选的判断条件(一个布尔值函数)。我们使用的是 inspect.isfunction,只获取模块中的函数。
promos = [globals()[name] for name in globals() if name.endswith('_promo') and name != 'best_promo']
6.2 “命令”模式

站在一定高度上看,这里采用的方式 与“策略”模式所用的类似:把实现单方法接口的类的实例替换成可调用对象。毕竟,每个 Python 可调用对象都实现了单方法接口,这个方法就是 __call__。
相关文章:
Fluent Python 笔记 第 6 章 使用一等函数实现设计模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用。1996 年,Peter Norvig 在题为“Design Patterns in Dynamic Languages”(http://norvig.com/design- patterns/)的演讲中指出,Gamma 等人合著的《设计模式:可复用面…...
windbg-应用层实时调试
调试符号windbg使用一个或多个目录来存放符号条件,并使用环境变量_NT_SYMBOL_PATH来指向这些环境变量的位置,对操作系统内部模块的符号文件,一般用http://msdl.microsoft.com/download/symbols配置如下:SRV*C:\Symbols*http://msd…...
【Python语言基础】——Python NumPy 数组索引
Python语言基础——Python NumPy 数组索引 文章目录 Python语言基础——Python NumPy 数组索引一、Python NumPy 数组索引一、Python NumPy 数组索引 访问数组元素 数组索引等同于访问数组元素。 您可以通过引用其索引号来访问数组元素。 NumPy 数组中的索引以 0 开头,这意味…...
MWORKS--MoHub介绍
MWORKS--MoHub介绍1 介绍1.1 简介1.2 功能特征2 快速上手2.1 进入工作台2.2 新建仓库并进入建模空间2.3 建模进入建模工作空间加载模型库新建模型2.4 仿真2.5 后处理曲线、动画2.6 查看模型信息3 使用手册参考1 介绍 1.1 简介 MWORKS.MoHub 支持工业知识、经验、数据的模型化…...
Netty零拷贝机制
Netty零拷贝机制一:用户空间与内核空间二:传统IO流程三:零拷贝常见的实现方式1. mmap write2. sendfile四:Java中零拷贝五:Netty 中如何实现零拷贝1. CompositeByteBuf 实现零拷贝2. wrap 实现零拷贝3. slice 实现零拷…...
C++:提高篇: 栈-寄存器和函数状态:windows X86-64寄存器介绍
寄存器1、什么是寄存器2、寄存器分类3、windows X86寄存器命名规则4、寄存器相关术语5、寄存器分类5.1、RAX(accumulator register)5.2、RBX(Base register)5.3、RDX(Data register)5.4、RCX(counter register)5.5、RSI(Source index)5.6、RDI(Destination index)5.7、RSP(stac…...
MyBatis-Plus入门案例
MyBatis-Plus入门案例一、MyBatis-Plus简介1、简介2、特性3、支持数据库4、框架结构5、代码及文档地址二、入门案例1、开发环境2、建库建表3、创建Spring Boot工程a>初始化工程b>引入依赖4、编写代码a>配置application.yml 或者 application.propertiesb>添加实体c…...
适用于 Windows 11/10/8/7 的 10 大数据恢复软件分享
适用于 Windows 11/10/8/7 的 最佳数据恢复软件综述。选择首选的专业数据/文件恢复软件,轻松恢复丢失的数据或删除的照片、视频等文件、SSD、外接硬盘、USB、SD卡等存储设备中的文件等。流行的sh流行的数据恢复软件也包括在内。 10 大数据恢复软件分享 为了帮助您恢…...
在线支付系列【23】支付宝支付接入指南
有道无术,术尚可求,有术无道,止于术。 文章目录前言接入指南1. 创建应用2. 绑定应用3. 配置密钥4. 上线应用5. 开通产品沙箱环境开发前准备(沙箱环境)1. 获取参数、秘钥、证书2. 下载支付宝客户端3. 案例演示前言 在之…...
linux系统常用命令
目录 一、系统介绍 二、Linux常用命令 1、Linux命令格式 2、文件目录操作命令:ls 3、文件目录操作命令:cd 4、文件目录操作命令:cat 5、文件目录操作命令:more 6、文件目录操作命令:tail 7、创建文件命令&…...
面试(十一)new与delete(整理) 及 内存泄露
c语言经常使用的是free与malloc,而c++又引入了new和delete它们的区别是什么呢? 内置类型 对于内置类型来说,free和delete、malloc和new几乎没什么区别,但如果是连续的空间,malloc和free只能申请和释放一块空间的内容,而new[] 和 delete[] 可以申请和释放一段连续的空间。…...
2D图像处理:2D ShapingMatching_缩放_旋转_ICP_显示ROI
文章目录 调试结果参考调试说明问题0:并行运行问题问题1:模板+Mask大小问题问题2:组合缩放和旋转问题3:可以直接将计算边缘的代码删除问题4:如何在原始图像上显示匹配到的ROI问题5:计算的原始旋转角度不需要判断,直接可以在ICP中使用问题6:绘制坐标轴问题7:绘制ROI调试…...
(考研湖科大教书匠计算机网络)第四章网络层-第一、二节:网络层概述及其提供的服务
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:网络层概述(1)概述(2)学习内容二:网络层提供的两种服务(1)面向连…...
概论_第8章_假设检验的基本步骤__假设检验的类型
一. 假设检验的基本步骤如下:第1步 根据实际问题提出原假设 及备择假设 , 要求 与 有且仅有一个为真;第2步 选取适当的检验统计量, 并在原假设 成立的条件下确定该检验统计量的分布;第3步 按问题的具体要求, 选取适当…...
SpringMVC--简介和入门案例
SpringMVC简介 什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体类Bean:专门存储业务数据的,如 Studen…...
Cmake入门02-检测环境(笔记)
文章目录检测操作系统处理平台相关源码处理编译器相关源码编译编译处理器相关源码检查cpu是32位还是64位的检测cpu架构处理 CPU指令相关源码案例展示 Eigen3向量化加速项目设置编译器开启向量化优化《CMake cookbook》笔记检测操作系统 cmake中通过CMAKE_SYSTEM_NAME变量来识别…...
Android JNI C++读写本地文件
文章目录小结Android JNI使用CAndroid JNI读写本地文件有关权限创建文件夹访问 /storage/emulated/0/访问/data/data/example.jniwritefile/时间戳Cant determine type for tag参考小结 进行Android JNI C读写本地文件,取得了想要的效果。 Android JNI使用C 对于…...
图形化深度学习开发平台PaddleStudio(代码开源)
目录一、PaddleStudio概述二、环境准备2.1 安装PaddlePaddle2.2 安装依赖库三、基本使用介绍3.1 启动3.2 快速体验3.2.1 下载示例项目3.2.2 训练3.2.3 评估3.2.4 测试3.2.5 静态图导出四、数据集格式4.1 图像分类4.2 目标检测4.3 语义分割4.4 实例分割五、趣味项目实战…...
【力扣-LeetCode】1138. 字母板上的路径-C++题解
1138. 字母板上的路径难度中等98收藏分享切换为英文接收动态反馈我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。在本题里,字母板为board ["abcde", "fghij", "klmno", "pqrst", &quo…...
基于Java+SpringBoot+Vue前后端分离酒店管理系统设计与实现
博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《S…...
STM32博物馆环境监控系统设计与实现
基于STM32的博物馆展柜环境监控系统设计1. 项目概述1.1 系统背景文物保护工作中,展柜微环境稳定性直接影响文物保存状态。传统人工巡检方式存在响应滞后、数据不连续等问题。本项目设计了一套基于STM32的智能化环境监控系统,可实时监测温湿度、光照、烟雾…...
谈谈你对springAop动态代理的理解?
面试 你要调用目标方法,不直接调用,而是交给代理对象,代理对象会先做额外功能,再调用原方法,最后再收尾。 至于叫动态代理的原因,是因为这个代理不是你手动写死的,而是程序在运行期间动态生成…...
3步打造极速安全系统:AtlasOS开源优化方案全解析
3步打造极速安全系统:AtlasOS开源优化方案全解析 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/Atl…...
零中断迁移:企业级文档系统全流程实战指南
零中断迁移:企业级文档系统全流程实战指南 【免费下载链接】outline Outline 是一个基于 React 和 Node.js 打造的快速、协作式团队知识库。它可以让团队方便地存储和管理知识信息。你可以直接使用其托管版本,也可以自己运行或参与开发。源项目地址&…...
环境感知驱动的EFI构建:让OpenCore配置效率提升300%
环境感知驱动的EFI构建:让OpenCore配置效率提升300% 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpenCore配置(OpenCore是一…...
从AHB到AXI:手把手带你用Verilog仿真看Outstanding如何提升SoC数据吞吐
从AHB到AXI:深入解析Outstanding机制如何优化SoC数据吞吐效率 在复杂的SoC设计中,总线架构的选择直接影响系统性能。传统AHB总线虽然结构简单,但在高并发场景下容易成为瓶颈。AXI协议通过引入Outstanding、Out-of-order等机制,显著…...
终极指南:如何使用Rainmeter构建内存使用趋势预测模型(ARIMA/SVM应用)
终极指南:如何使用Rainmeter构建内存使用趋势预测模型(ARIMA/SVM应用) 【免费下载链接】rainmeter Desktop customization tool for Windows 项目地址: https://gitcode.com/gh_mirrors/ra/rainmeter Rainmeter作为一款强大的Windows桌…...
3步轻松读取Outlook邮件:免费跨平台MSG查看工具让你告别格式困扰
3步轻松读取Outlook邮件:免费跨平台MSG查看工具让你告别格式困扰 【免费下载链接】MsgViewer MsgViewer is email-viewer utility for .msg e-mail messages, implemented in pure Java. MsgViewer works on Windows/Linux/Mac Platforms. Also provides a java api…...
如何快速掌握终端数字雨效果:完整跨平台配置指南
如何快速掌握终端数字雨效果:完整跨平台配置指南 【免费下载链接】cmatrix Terminal based "The Matrix" like implementation 项目地址: https://gitcode.com/gh_mirrors/cm/cmatrix 想在终端中重现《黑客帝国》电影里的经典数字雨场景吗…...
深入浅出ESP32蓝牙HID协议:从报文解析到游戏手柄开发
深入浅出ESP32蓝牙HID协议:从报文解析到游戏手柄开发 在物联网设备与人机交互技术深度融合的今天,蓝牙HID协议已成为连接智能硬件与终端设备的重要桥梁。ESP32作为一款集成Wi-Fi和蓝牙双模通信的微控制器,凭借其出色的性价比和丰富的开发资源…...
