风火编程--策略模式, 命令模式,单分派泛函数扩展不同类型参数的处理逻辑

2023-10-28

《流畅的python》读书笔记(四)

6.1 策略模式
将不同对的策略封装到不同的策略方法中, 创建策略实例,传入上下文(实际场景), 执行计算方法获得策略的结果集, 执行排序方法选出最佳策略.

from operator import itemgetter
class Promotion():
    """策略"""
    def __init__(self, price, quantity):
        self.price = price
        self.quantity = quantity
        self.comparison()
    def A(self):
        discount = 10
        return "A", discount

    def B(self):
        discount = self.price*self.quantity*0.1
        return "B", discount

    def comparison(self):
        self.decision, self.max_discount = sorted(
            [self.A(), self.B()], key=itemgetter(1), reverse=True)[0]

p = Promotion(20, 10)
print(p.decision, p.max_discount)

如果使用函数定义策略用globals()可以获取所有策略的函数名映射,通过globals()"func_name"调用策略.

6.2 命令模式
把操作封装成函数作为命令
在客户端中的命令菜单中调用命令,执行操作

import random
def command_A():
    print("do A")
def command_B():
    print("do B")
menu = ["command_A", "command_B"]
client_command = random.choice(menu)
result = globals()[client_command]()

7.4 变量的作用域
python在编译函数体的时候会判断变量是本地还是全局, 如果有本地变量,则不会读取全局变量, 但是如果变量在本地的的定义是在调用之后会报错.

a = b = 1
def test():
    print(a)
    print(b)
    b = 2

test()

7.8 内置装饰器
缓存装饰器

@lru_cache

把耗时的函数结果自动缓存起来, 传入相同参数的时候直接调用,
用于优化递归算法,或者web后台的视图函数, 函数的所有参数必须可散列.

7.9 单分派泛函数装饰器

@functools.singledispatch

区分处理不同的数据类型,实现调用同一个函数,不同的处理逻辑,
相当于在函数内部进行if–elif–else判断参数类型做不同的处理

import functools
@functools.singledispatch
def func(s):
    """处理对象类型数据的基函数"""
    print("str is", s)

@func.register(int)
def _(num):
    """处理int类型的扩展函数"""
    print("int is", num)


func(2)

7.10 参数化装饰器
接收不同的参数,完成不同功能的装饰器

def factory(flag=True):
    """定义装饰器的函数"""
    def wrapper(func):
        """内层函数"""
        if flag:
            print("before func")
        func()
        if not flag:
            print("after func")
        return func
    return wrapper
@factory(False)
def function():
    """被装饰函数"""
    print("here is func")
print("----------------------------")
function()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

风火编程--策略模式, 命令模式,单分派泛函数扩展不同类型参数的处理逻辑 的相关文章

  • 《Python进阶系列》二十三:解决线性规划和二次型规划问题的CVXOPT模块

    Python CVXOPT模块 Python中支持Convex Optimization 凸规划 的模块为CVXOPT 能够解决线性规划和二次型规划问题 其应用场景如SVM中的Hard Margin SVM Creating matrice
  • DOS命令(windows)

    DOS命令 windows 目录 1 打开命令提示符 2 切换至根 3 当前路径 4 切换至上级路径 5 查看当前目录 6 查看文件内容 7 删除文件 8 进入长文件夹名时缩写 9 复制文件 10 移动文件 1 打开命令提示符 命令 win
  • @Async 异步调用

    策略模式 一 Async 基础 基础使用示例 二 Async 与线程池 实现AsyncConfigurer 替换默认线程池 指定 Async 使用的线程池 一 Async 基础 在编写接口时大多数情况下都是通过同步的方式来实现交互处理 在特
  • 《Python进阶系列》六:Python中的文件对象

    文件对象的seek 和tell 打开一个文件 读取内容 是很常见的操作 不过有的时候我们还需要反复读取文件中的内容 如果多次打开文件读取再多次关闭 显然不是特别好的操作 我们可以借助Python文件对象的seek 和tell 函数 来实现反
  • 使用InitializingBean实现策略模式

    1 创建SpringBoot项目 2 创建抽象类AbstractThreeHandler public abstract class AbstractThreeHandler implements InitializingBean Auto
  • 大话设计模式—策略模式

    在策略模式 Strategy Pattern 中 一个类的行为或其算法可以在运行时更改 这种类型的设计模式属于行为型模式 大话设计模式中程杰老师给出的定义是这样的 策略模式 Strategy 定义了算法家族 分别封装起来 让它们之间可以互相
  • Python JSON格式处理

    从外部读入的json经过loads反序列化后可以转换为dict类型的数据 dict类型的数据可以通过dumps转换为json格式的数据 param self request body decode utf 8 dict data json
  • 《Python进阶系列》十: 整理文件和目录最最最常用的os模块

    盘一盘Python中的os模块 os模块是Python标准库中整理文件和目录最为常用的模块 该模块提供了非常丰富的方法用来处理文件和目录 图来自 https www cnblogs com ltkekeli1229 p 15709442 h
  • 【QT 网络云盘客户端】——实现文件属性窗口

    目录 文件属性对话框 设置字体样式 获取文件的信息 显示文件属性对话框 当我们点击文件中的属性 则会弹出一个属性对话框 实现过程 0 设置 属性 菜单项的槽函数 1 鼠获取鼠标选中的QListWidgetItem 它包含 图标和文件名 2
  • 【QT 网络云盘客户端】——实现文件属性窗口

    目录 文件属性对话框 设置字体样式 获取文件的信息 显示文件属性对话框 当我们点击文件中的属性 则会弹出一个属性对话框 实现过程 0 设置 属性 菜单项的槽函数 1 鼠获取鼠标选中的QListWidgetItem 它包含 图标和文件名 2
  • Python进阶-----面对对象7.0(细谈__new__方法和__init__方法)

    目录 前言 init 方法 new 方法 重点 1 new 方法的调用过程 2 重写 new 方法 3 new 方法不同返回值的情况 3 单例模式 前言 上一期初步介绍了 new 方法 但是实际上这个方法还有非常多的内容值得去讲一讲 学会了
  • Python中最小堆结构的heapq模块

    堆是非线性的树形的数据结构 完全二叉树 有两种堆 最大堆与最小堆 heapq库中的堆默认是最小堆 最大堆 树中各个父节点的值总是大于或等于任何一个子节点的值 最小堆 树中各个父节点的值总是小于或等于任何一个子节点的值 我们一般使用二叉堆来实
  • 考虑virtual函数以外的其他选择——条款35

    假设你正在写一个视频游戏软件 你打算为游戏内的人物设计一个继承体系 你的游戏术语暴力砍杀类型 剧中人物被伤害或因其他因素而降低健康状态的情况并不罕见 你因此决定提供一个成员函数healthValue 它会返回一个整数 表示人物的健康程度 由
  • 策略模式(Strategy)

    设计模式之策略模式 策略模式的主要作用是 整体地替换算法 无论什么程序 其目的都是解决问题 而为了解决问题 我们需要编写特定的算法 使用Strategy模式可以整体地替换算法的实现部分 能够整体地替换算法 能让我们轻松地以不同的算法解决同一
  • QT实现中英文键盘

    使用Qt中实现中英文键盘 支持各种linux嵌入式设备 实现思路 需要一个中文字体库 将字体库加载到一个Hash容器 字母和拼音作为key值 对应的中文作为value值 核心代码 include UKeyBoard h include ui
  • GPT带我学-设计模式-命令模式

    1 你知道设计模式的命令模式吗 是的 我知道设计模式中的命令模式 命令模式是一种行为型设计模式 它将请求封装成一个对象 从而允许使用不同的请求 队列或日志来参数化其他对象 命令模式还支持撤销操作 并且可以提供事务的实现 在命令模式中 有四个
  • Linux基础命令-echo输出信息

    文章目录 前言 一 echo命令介绍 二 命令语法及参数 三 参考实例 总结 前言 初学linux都会接触到这个echo命令 因为这个echo的用处实在太大了 不管说日常使用上还是写shell脚本中 都是需要用到的 echo命令可以输出用户
  • 【Python 协程详解】

    0 前言 前面讲了线程和进程 其实python还有一个特殊的线程就是协程 协程不是计算机提供的 计算机只提供 进程 线程 协程是人工创造的一种用户态切换的微进程 使用一个线程去来回切换多个进程 为什么需要协程 导致Python不能充分利用多
  • C# 是单调度语言还是多调度语言?

    我试图准确理解什么是单次调度和多次调度 我刚刚读过这个 http en wikipedia org wiki Multiple dispatch http en wikipedia org wiki Multiple dispatch 从这
  • [Python进阶] Python处理txt文件:open

    7 1 Python处理txt文件 open 在Python中 通过open函数可以打开一个文件 创建一个file对象 然后对该对象进行读写 函数语法 open name mode buffering 参数说明 name 文件名 mode

随机推荐

  • python爬取站长素材上的图片

    Python爬取站长素材上的图片 罗纳尔康 首先这是一个学习的案例 我将其记录下来 因为所学的内容有点多 爬取这个图片 我是用的xpath来解析网页 当然也可以用bs4来进行解析 看个人喜好 该案例比较简单 但涉及的内容并不少 1 分析每页
  • Web3域名,会是新的应用场景么?

    在互联网时代 域名一直都是一个十分有价值的资产 无论是个人还是企业 想要在互联网中建立一个交互性的平台 网站 都需要一个域名来与 IP 地址进行映射 域名是具有唯一性的 因此 它遵循 先到先得 的原则 即一旦有用户注册了一个域名之后 其他人
  • 【序列比对】Needleman-Wunsch(全局)和Smith-Waterman(局部)算法py实现(多条回溯路径,三叉树思路,超详细注释)

    Needleman Wunsch和Smith Waterman算法py实现 多条回溯路径 话不多说 直接上结果图 多条回溯路径 原理 代码详解 以NW为例 导入包以及参数设置 import numpy as np sequence 1 AA
  • cmd命令提示符使用功能大全

    cmd命令提示符使用功能大全 winver 检查windows版本 arch 显示机器的处理器架构 1 uname m 显示机器的处理器架构 2 uname r 显示正在使用的内核版本 dmidecode q 显示硬件系统部件 SMBIOS
  • 串口收数数码管显示(串口带协议带校验)

    将上位机采集到的数据通过串口发给单片机 数码管显示收到的信息 数码管显示程序见上篇文章 串口带协议收发在我的文章中也可以找到 mian函数 BYTE CODE 10 0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x
  • ArgoCD的安装与部署

    一 简介 Argo CD 是一个为 Kubernetes 而生的 遵循声明式 GitOps 理念的持续部署 CD 工具 它的配置和使用非常简单 并且自带一个简单易用的 Dashboard 页面 并且支持多种配置管理 模板工具 例如 Kust
  • 区块链开发入门之一

    基本概念 区块链的核心理念 一个分布式数据库 其基本单元为区块 取款用来存储数据 区块之间前后关联 通过时间排序 基于PKI 摘要算法实现集体验证 维护 区块链提供了一个分布式总账 让用户对总账的数据实现共同治理 因而建立互信 区块链基本逻
  • mscrm导入其他组织的数据库

    在部署mscrm的时候 有时候会有这样的问题 新建一个组织 如何让这个组织使用已经存在的另一个组织的数据库 即多个组织公用一个crm数据库 1 打开部署管理器 开始 所有程序 Microsoft Dynamics CRM 部署管理器 2 点
  • [docker]七、docker镜像的制作(超详细)、docker镜像结构原理、镜像的分享——harbor

    目录 1 镜像 images 1 1 Dockerfile 是制作镜像的文件 2 镜像结构原理 2 1 base 镜像 2 1 1 rootfs和bootfs 2 1 2 base 镜像提供的是最小安装的 Linux 发行版 2 2 镜像分
  • 气液固三相线识别—Langmuir部分复现

    关注 M r m a t e r i a l color Violet rm Mr material Mr material
  • 记 Git 报错:refusing to merge unrelated histories

    问题追溯 创建本地项目 我在本地电脑上创建了一个项目admin hz 创建码云同名项目admin hz 创建方法我另一篇文章有讲 项目地址 https gitee com liushijun admin hz git 将本地项目与远程项目关
  • jira字段配置(域配置)_到期日、时间跟踪等根据需要自行配置

    最近 使用jira进行项目管理 出现一些问题 对于其中一些配置 做下记录 后续方便查看 也给需要的人一个参考 传送门 jira使用文档 jira权限设置 各个项目组查看不同项目 jira字段配置 域配置 到期日 时间跟踪等根据需要自行配置
  • AI 培训之坑,了解一下?

    今天阅读微信公众号的文章 又刷到了一篇AI程序员平均年薪多少多少 Python前景多好多好的文章 我立刻猜到 这肯定又是某家培训给自己的AI课程打的广告 如今各种公众号类似的文章实在太多了 感觉给没转行又想入坑的人画了很大一张饼 我本人就是
  • Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释

    我们是在使用Spring框架的过程中 其实就是为了使用IOC 依赖注入 和AOP 面向切面编程 这两个是Spring的灵魂 主要用到的设计模式有工厂模式和代理模式 IOC是工厂模式参考 设计模式 工厂模式 场景以及优缺点 目的就是应对变化
  • 论文笔记:An iterative framework with active learning to match segments in road networks

    CARTOGRAPHY AND GEOGRAPHIC INFORMATION SCIENCE 2023 1 intro 1 1 背景 当地理实体以不同的方式表示和存储在不同的来源中时 匹配和整合使得可以获得更详细的空间数据 地图匹配的关键是
  • 浅谈Java异常处理机制及项目中的的规范处理方法

    一 前言 本文主要讲述异常处理的机制和原理 以及探讨开发Java程序时 每一层如何进行异常处理 异常何时被抛出 何时被记录 如何记录 记录checked异常还是unChecked异常 异常是否应该呈现到前端页面 如何设计一个异常框架等问题
  • git管理代码

    理论上改代码前要pull一次 然后在push前在pull一次 改代码前pull一次是为了获取最新的同步 但是coding也是需要时间的 难保敲代码的这段时间没有人动远程仓库的东西 所以在改完代码要push的时候也应该再pull一下看有无冲突
  • 如果你持续大量的教坏ChatGPT,它确实会变坏

    你输出的很多数据是经过人工标注吗 以确保可以正常对外展示出来 而不是有性别歧视 种族歧视或者其它意识形态为多数人所不认同的内容产生 作为AI语言模型 我并不直接处理或输出任何数据 我的任务是通过对输入的自然语言进行分析和生成 输出与输入相关
  • 在python3.6环境下使用os.walk遍历所有的中文文件夹,并且打印对应的地址(包括os.walk的语法)

    首先来看看文件夹的分布和文本内容 可以看到保险文件夹下有三个文件夹 每个文件夹中又包含许多TXT文本 所有代码如下 coding utf 8 import os for root dirs files in os walk r C User
  • 风火编程--策略模式, 命令模式,单分派泛函数扩展不同类型参数的处理逻辑

    流畅的python 读书笔记 四 6 1 策略模式 将不同对的策略封装到不同的策略方法中 创建策略实例 传入上下文 实际场景 执行计算方法获得策略的结果集 执行排序方法选出最佳策略 from operator import itemgett