python3 如何给装饰器传递参数

2023-05-16

引子

  之前写过一篇文章用来讲解装饰器(https://www.cnblogs.com/JiangLe/p/9309330.html) 、那篇文章的定位是入门级的

  所以也就没有讲过多的高级主题,决定在这里讲一下如果为装饰器传递参数

 

目标

  我们有两个函数“add_fun”、“add” 其中“add_fun”已经过时、如果用户有调用这个函数的话就提示它“add_fun”已经过时并且引导

  它去调用“add”函数

 

add\add_fun函数的定义


def add_fun(x,y):
    """
    实现两个数相加、并返回合
    """
    return x+y


def add(x,y):
    """
    实现两个数相加、并返回合
    """
    return x+y    

 

通过装饰器引导调用add_fun的用户去调用add


def deprecated(fun,new_fun_name):
    """deprecated函数会返回一个叫inner的函数、inner函数会返回
    fun调用的结果,与直接调用fun得到值不同的是inner会先打印一行提示
    表明fun已经过时
    """
    def inner(x,y):
        print("{fun.__name__} 函数已经过时 请使用{new_fun_name}".format(fun=fun,new_fun_name=new_fun_name))
        return fun(x,y)
    return inner

def add_fun(x,y):
    """
    实现两个数相加、并返回合
    """
    return x+y

add_fun = deprecated(add_fun,'add')

def add(x,y):
    """
    实现两个数相加、并返回合
    """
    return x+y    

if __name__=="__main__":
    print(add_fun(1,1))  

  调用时的输出如下:


python3 dc.py
add_fun 函数已经过时 请使用add
2  

 

难道为装饰器增加参数就这么的简单

  仔细的你可能已经发现了、我们在上面的代码里并没有用装饰器的语法糖衣、而是通过函数调用的方式来包装的add_fun方法


add_fun = deprecated(add_fun,'add')  

  机智的你应该想到了@deprecated('add') 这样去装饰add_fun应该也能成吧!于是代码如下(关键代码)


@deprecated('add')
def add_fun(x,y):
    """
    实现两个数相加、并返回合
    """
    return x+y  

  当你调用时会发现完全不是你想要的那样、


python3 dc.py
Traceback (most recent call last):
  File "dc.py", line 12, in <module>
    @deprecated('add')
TypeError: deprecated() missing 1 required positional argument: 'new_fun_name'  

  事实上目前语法糖衣只解决了最简单的情况、如果你要给@写法 指定参数还要另寻它法。

 

真理简洁而有力

  linux的世界里有句话“一切皆文件”,python的世界里也有一句话“一切皆对象”; 但是关键不是会“背”,而是“领悟”。

  一个经典的糖衣格式是这样的


@decorate
def fun():
    pass  

  请仔细看一下不难发现@后面直接是对象名、由python的数据模式可知、对象名只是一个对象的标识;也就是说@后面是一个对象!对象可以

  是已经定义好的,也可以是调用才生成。明白这一层道理之后事情就比较好办了,我们只要在调用时生成“装饰”对象就可以了,因为要调用

  所以就给了我们传递参数的机会。

 

触摸真理一

   用调用时生成的对象用作装饰器


def deprecated(new_fun_name):
    """derepcated 装饰器把函数标记为过时
    """
    def warpper(fun):
        """
        """
        def inner(*args):
            print("{0} 函数已经过时 请使用 {1}".format(fun.__name__,new_fun_name))
            return fun(*args)
        return inner
    
    return warpper

decorator = deprecated('add') # 特意把这一步单独分离出来、用于说明什么叫调用时创建的对象用作做装饰器

@decorator                    # 特意把这一步单独分离出来、用于说明什么叫调用时创建的对象用作做装饰器
def add_fun(x,y):
    """
    实现两个数相加、并返回合
    """
    return x+y

def add(x,y):
    """
    实现两个数相加、并返回合
    """
    return x+y    

if __name__=="__main__":
   print(add_fun(1,1))  

 

  

触摸真理二

  与语法糖衣结合、完成传递参数的目的


def deprecated(new_fun_name):
    """derepcated 装饰器把函数标记为过时
    """
    def warpper(fun):
        """
        """
        def inner(*args):
            print("{0} 函数已经过时 请使用 {1}".format(fun.__name__,new_fun_name))
            return fun(*args)
        return inner
    
    return warpper


@deprecated('add')
def add_fun(x,y):
    """
    实现两个数相加、并返回合
    """
    return x+y

def add(x,y):
    """
    实现两个数相加、并返回合
    """
    return x+y    

if __name__=="__main__":
   print(add_fun(1,1))  

  调用时输出如下


python3 dc.py
add_fun 函数已经过时 请使用 add
2  

 

 

总结:

  如果只能用一名话概括python我想对简洁的应该是“一切皆对象”了吧。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3 如何给装饰器传递参数 的相关文章

  • 个人团队贡献分+转会人员

    经过我们的商议 xff0c 个人团队贡献分如下分配 xff1a 黄杨 xff1a 33 王安然 xff1a 32 韩佳胤 xff1a 31 刘俊伟 xff1a 28 林璐 xff1a 29 谢伯炎 xff1a 30 谭传奇 xff1a 27
  • 如何在bash shell命令行中非常有效地搜索历史命令?

    How to search history commands very effectively in bash shell command line 如何在bash shell 命令行中非常有效地搜索历史命令 xff1f Just ente
  • GreenPlum 锁表以及解除锁定

    最近遇到truncate表 xff0c 无法清理的情况 xff0c 在master节点查看加锁情况 xff0c 并未加锁 这种情况极有可能是segment节点相关表加了锁 xff0c 所以遇到这种情况除了排查master节点的锁 xff0c
  • 使用 FreeRTOS 时注意事项总结(基础篇教程完结)

    以下转载自安富莱电子 xff1a http forum armfly com forum php FreeRTOS 的初始化流程 推荐的初始化流程如下 xff0c 本教程配套的所有例子都是采用的这种形式 xff0c 当然 xff0c 不限制
  • 使用Python实现Hadoop MapReduce程序

    为什么80 的码农都做不了架构师 xff1f gt gt gt 笔者的机器运行效果如下 xff08 输入数据是find的帮助手册 xff0c 和笔者预期一样 xff0c the是最多的 xff09 xff1a 以下是原帖 在这个实例中 xf
  • 解决vnc连接Linux出现X形

    编辑vnc配置文件 vnc xstartup如下 xff1a bin sh Uncomment the following two lines for normal desktop unset SESSION MANAGER exec et
  • 交换机 BootROM 下的升级配置

    实验十 交换机 BootROM 下的升级配置 一 实验目的 1 了解什么时候采用 BootROM 升级 xff1b 2 了解怎样使用 BootROM升级交换机 二 应用环境 当交换机的系统文件遭到破坏时 xff0c 已经无法进入正常的CLI
  • 如何利用 Visual Studio 自定义项目或工程模板

    在开发项目的时候 xff0c 由其是商业性质的大型项目时 xff0c 往往需要在每个代码文件上都加上一段关于版权 开发人员的信息 xff0c 并且名称空间上都需要带有公司的标志 这个时候 xff0c 是选择在开发的时候手动添加还是自动生成呢
  • vncserver和Ubuntu Xfce4远程桌面环境的配置,解决不显示图形界面

    vncserver和Ubuntu Xfce4远程桌面环境的配置 参考的http blog 163 com thinki cao blog static 83944875201303014531803 ubuntu用vnc连接后不显示图形界面
  • Windows平台下利用Fastcopy来做数据的定期同步

    FastCopy号称是Windows 平台上最快的文件拷贝 删除软件 xff0c 特别是文件超多 超大的情况下 为此我们在数据备份的时候选择FastCopy 但是 FastCopy如果直接来做计划任务的话会有一个问题 xff0c 因为打开的
  • 善用VS中的Code Snippet来提高开发效率

    前言 在谈谈VS中的模板中 xff0c 我介绍了如何创建项目 项模板 xff0c 这种方式可以在创建项目时省却不少重复性的工作 xff0c 从而提高开发效率 在创建好了项目和文件后 xff0c 就得开始具体的编码了 xff0c 这时又有了新
  • [git]merge和rebase的区别

    前言 我从用git就一直用rebase xff0c 但是新的公司需要用merge命令 xff0c 我不是很明白 xff0c 所以查了一些资料 xff0c 总结了下面的内容 xff0c 如果有什么不妥的地方 xff0c 还望指正 xff0c
  • 正则表达式python_Python的隐藏正则表达式宝石

    正则表达式python There are many terrible modules in the Python standard library but the Python re module is not one of them W
  • IP地址自动封与解封的shell脚本

    本脚本学习与阿铭的脚本课程 用于防止公司网站被DDos攻击时 xff0c 封禁 肉机 的IP地址 共分为以下步骤 xff1a 1 每分钟分析一次访问日志 data logs access log 2 把访问量超过100的IP给封掉 3 将封
  • 应用中抛出SELECT/UPDATE/INSERT/DELETE command denied to user 'XXX'@'XXX.XXX.XXX.XXX' for table 'xxx' 的5种原...

    实为吾之愚见 望诸君酌之 闻过则喜 xff0c 与君共勉 第一章 准备环境 创建数据测试数据 xff0c 以下测试多是基于自建mysql进行 mysql gt create database test1 Query OK 1 row aff
  • 数据标注的作用及行业现状

    在之前的内容中讲过确立一个算法模型需要使用大量标注好的数据去训练机器让机器去学习其中的特征以达到 智能 的目的 而数据标注就是帮助机器去学习去认知数据中的特征 比如我们要让机器学习认知汽车 xff0c 我们直接给机器一个汽车的图片它是无法识
  • 如何解决安卓手机显示google play服务停止运行?

    相信不少的安卓用户都遇到过这种情况 xff1a 很抱歉 xff0c google play服务 已停止运行 这到底是怎么一回事呢 xff1f 接下来就通过本文来给大家介绍一下 xff0c 我们一起往下看 xff01 其实呢 xff0c 这句
  • Failed to stop the server machine ' xxx.xxx'

    2019独角兽企业重金招聘Python工程师标准 gt gt gt arcgis for server 10 2 在部署新站点时抛出异常 xff1a Failed to create the site Failed to stop the
  • vue中使用jquery报错 $ is not defined

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 问题 is not defined 在使用Vs Code编写Vue应用的时候 xff0c 从页面中引入jquery后 xff0c 在 vue文件编写使用时 xff0c
  • 即将发布的 ASP.NET Core 2.2 会有哪些新玩意儿?

    今年 6 月份的时候时候 NET 团队就在 GitHub 公布了 ASP NET Core 2 2 版本的 Roadmap xff08 文末有链接 xff09 xff0c 而前两天 ASP NET Core 2 2 预览版 2 已经可以下载

随机推荐

  • 【three.js练习程序】随机生成100个方块

    lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt ceshi lt title gt lt script type
  • [转]你应该知道的CSS文字大小单位PX、EM、PT

    这里引用的是Jorux的 95 的中国网站需要重写CSS 的文章 xff0c 题目有点吓人 xff0c 但是确实是现在国内网页制作方面的一些缺陷 我一直也搞不清楚px与em之间的关系和特点 xff0c 看过以后确实收获很大 平时都是用px来
  • 实践这一次,彻底搞懂浏览器缓存机制

    前言 实践系列 主要是让我们通过实践去加深对一些原理的理解 实践系列 前端路由 实践系列 Babel原理 实践系列 Promises A 43 规范 有兴趣的同学可以关注 实践系列 求star求follow 如果觉得自己已经掌握浏览器缓存机
  • lxc lxd_如何在LXC和LXD中使用Linux容器

    lxc lxd In the good old days installing an operating system meant pulling together all the hardware components firing yo
  • (linux)Centos 7 xfsdump文件系统的备份和恢复

    XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据 xfsdump 按inode顺序备份一个XFS文件系统 centos7选择xfs格式作为默认文件系统 xff0c 而且不再使用以前的ext xff0
  • 佳能2900脱机自检_HP打印机脱机自检方法

    HP激光打印机如何在打印机面板上打印脱机自检页 背景 在打印机使用过程中经常需要查看打印机状态 xff0c 此时我们可以打印脱机 自检页来 帮助我们判断 xff0c 下面列出了 HP 激光打印机打印脱机 自检页的 方法 控制面板其他操作请参
  • loglog matlab,MATLAB 函数loglog()

    它使用x和y轴的对数刻度生成向量x和y的图 句法 loglog Y It should plot the columns of Y versus their index if Y includes real numbers If Y inc
  • k30s刷鸿蒙系统,Redmi K30S至尊版喜提MIUI 12.5稳定版

    Redmi K30S至尊版喜提MIUI 12 5稳定版 2021 05 07 13 20 05 16点赞 18收藏 104评论 进入5月 xff0c 第二批升级MIUI 12 5的机型也陆续开启推送 xff0c 在五一小长假期间包括Redm
  • html中有序列表的css样式,CSS 列表样式(ul)

    CSS 列表 CSS 列表属性作用如下 xff1a 设置不同的列表项标记为有序列表 设置不同的列表项标记为无序列表 设置列表项标记为图像 列表 在 HTML 中 xff0c 有两种类型的 HTML列表 xff1a 无序列表 列表项的标记使用
  • 网易邮箱发送失败服务器连接失败,网易邮件发送不出去MI:SFQ错误

    因为业务需要 xff0c 写了一个在线留言发送到邮箱的小程序 xff0c 前几天使得挺好 突然发送不了了 xff0c 报错事务失败 服务器响应为 5 5 0 MI STC 经过百度查询 xff0c 发现是 550 MI STC 短期内发送了
  • ajax部分验证表单数据,简单的Ajax+Servlet表单数据验证

    var XMLHttpReq 创建XMLHttpRequest对象 function createXMLHttpRequest if window XMLHttpRequest Mozilla 浏览器 XMLHttpReq 61 new X
  • 云服务器装操作系统吗,云服务器能装操作系统吗

    云服务器能装操作系统吗 内容精选 换一换 监控是保持云耀云服务器可靠性 可用性和性能的重要部分 xff0c 通过监控 xff0c 用户可以观察云耀云服务器资源 为使用户更好地掌握自己的云耀云服务器运行状态 xff0c 公有云平台提供了云监控
  • 打造性能服务器图片,详解用node-images打造简易图片服务器.pdf

    详详解解用用node images 打打造造简简易易图图片片服服务务器器 Edit 2016 5 11 修正了代码里面一些明显的错误 xff0c 并发布在 aj axj s 之中 xff0c 源码在这里 Edit 2016 5 24 加入
  • 企业应用:浅谈 “数据权限” 和 查询 API 设计

    背景 多数企业应用都需要对数据权限进行控制 xff0c 如 xff1a 某个用户只能看到某个范围的数据 xff08 数据行 xff09 某个用户只能看到某几列数据 xff08 数据列 xff09 本文以数据行级别的权限控制为范例 xff0c
  • 您必须了解的4种OpenStack Neutron网络类型

    如果您托管的OpenStack虚拟实例需要网络连接 xff0c 则必须创建一个网络 有多种类型的网络 xff0c 为了做出正确的选择 xff0c 您至少需要了解两个非常重要的网络属性 xff1a router xff1a external
  • 动态链接库*.so的编译与使用- -

    动态链接库 so的编译与使用 动态库 so在linux 下用c和c 43 43 编程时经常会碰到 xff0c 最近在网站找了几篇文章介绍动态库的编译和链接 xff0c 总算搞懂了这个之前一直不太了解得东东 xff0c 这里做个笔记 xff0
  • Linux系统VNC配置实践总结

    VNC 概述 VNC Virtual Network Computing 是 虚拟网络 计算机 的缩写 VNC 是一款优秀的 远程控制 工具软件 xff0c 由著名的 AT amp T 的欧洲研究实验室开发的 VNC 是在基于 UNIX 和
  • linux不需要杀毒软件

    linux一般不需要杀毒软件 所有在windows下的病毒在linux下都失效 xff0c 即使你下载一堆病毒 xff0c 不论多强的病毒 xff0c 对病毒狂点都没事 既然没中毒 xff0c 切换回windows当然也没事 xff0c 但
  • 使用badblocks命令检测、修复硬盘坏道

    badblocks是Linux下常用的坏道修复工具 当你觉得硬盘上可能有坏道 xff0c 或者是SMART数据显示有坏道的时候 xff0c 都可以用badblocks来检查一下 假设我们要检查的硬盘是 dev sdb sudo badblo
  • python3 如何给装饰器传递参数

    引子 之前写过一篇文章用来讲解装饰器 https www cnblogs com JiangLe p 9309330 html 那篇文章的定位是入门级的 所以也就没有讲过多的高级主题 xff0c 决定在这里讲一下如果为装饰器传递参数 目标