python2装饰器_python函数装饰器

python2装饰器_python函数装饰器前言我们都知道装饰器的作用是在不改变原有的代码基础上,添加新的功能,但是这样会有一个弊端,被装饰的函数某些属性会变改变,接下来我们来看下案例importtimedefrun_time(fu

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

我们都知道装饰器的作用是在不改变原有的代码基础上,添加新的功能,但是这样会有一个弊端,被装饰的函数某些属性会变改变,接下来我们来看下
 

案例

import time


def run_time(func):
    def wrapper(*args, **kwargs):
        """时间装饰器"""
        time1 = time.time()
        func(*args, **kwargs)
        time2 = time.time()
        cost_time = time2 - time1
        return f"函数花了{cost_time}秒"
    return wrapper


@run_time
def test():
    """测试"""
    print([i for i in range(1, 100001) if i % 200 == 0])


if __name__ == '__main__':
    print(test.__name__)   
    print(test.__doc__)  
"""
结果
# wrapper
# 时间装饰器
"""

可以看到,我们明明打印的是test函数的__name__属性,最后显示的却是run_time的属性。
 
我们知道@run_time装饰器实际上就等于test = run_time(test),此时我们打印test.__name__实际上test已经指向了wrapper,这样会造成我们打印的时候会打印装饰器的内嵌函数的名字和注释。
 

使用wraps装饰器解决

wraps可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module____name____doc____qualname____annotations__或者通过参数选择

import time
from functools import wraps


def run_time(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        """时间装饰器"""
        time1 = time.time()
        func(*args, **kwargs)
        time2 = time.time()
        cost_time = time2 - time1
        return f"函数花了{cost_time}秒"
    return wrapper


@run_time
def test():
    """测试"""
    print([i for i in range(1, 100001) if i % 200 == 0])


if __name__ == '__main__':
    print(test.__name__)   
    print(test.__doc__) 
"""
结果:
test
测试
"""

我们就只在原来的wrapper内函数上加了一个@wraps(func)装饰器,就可以打印出我们想要的结果了,这是因为wraps可以将原函数对象的指定属性复制给包装函数对象,我们可以查看它的源码

def wraps(wrapped,
          assigned = WRAPPER_ASSIGNMENTS,
          updated = WRAPPER_UPDATES):
    """Decorator factory to apply update_wrapper() to a wrapper function

       Returns a decorator that invokes update_wrapper() with the decorated
       function as the wrapper argument and the arguments to wraps() as the
       remaining arguments. Default arguments are as for update_wrapper().
       This is a convenience function to simplify applying partial() to
       update_wrapper().
    """
    return partial(update_wrapper, wrapped=wrapped,
                   assigned=assigned, updated=updated)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/165479.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++ 常量表达式_c++符号常量

    c++ 常量表达式_c++符号常量常量表达式主要是允许一些计算发生在编译时,即发生在代码编译阶段而不是代码运行阶段。这是很大的优化,因为如果有些事情可以在编译时做,那么它只会做一次,而不是每次程序运行时都计算。使用constexpr,你可以创建一个编译时的函数:constexprintgetConst(){ return3;}voidtest07(){ intarr[getConst()]={0}…

    2022年9月29日
    3
  • TreeView的RenderControl的问题「建议收藏」

    TreeView的RenderControl的问题「建议收藏」TreeView,这东西,正常情况下一般是不用的,不过我们的美工,没弄个树型的样式出来,没折,将就用一下TreeView了说重点:环境搭建:一页面,拖一下TreeView控件上去,随便添加几个项。然后Page_Load事件里输出:CodeSystem.IO.StringWritersw=newSystem.IO.StringWriter();…

    2022年7月20日
    13
  • 《我的极品媳妇》方志强 王亚欣 小说读后感

    《我的极品媳妇》方志强 王亚欣 小说读后感男主角方志强博爱和善良的性格及对待生活的刚毅和坚韧让人敬佩,无论是对待自己的背叛过的兄弟还是互殴的光头都是义字当头,对无耻小人以及伤害身边家人的败类绝不手软,如此种种人格魅力的塑造相当完美;但唯一的缺点是对感情的优柔寡断。在本书中始终在反复得而复失幸福的痛苦中挣扎,但这些也是方志强感情方面性格缺陷导致的。女主王亚欣温柔、贤惠、成熟、多金、坚强、最主要的出身平凡,和男主方志强起步阶段是同一类型的。…

    2022年6月4日
    59
  • SpringBoot整合Dubbo3.0基础配置

    SpringBoot整合Dubbo3.0基础配置SpringBoot 整合 Dubbo3 0 基础配置 dubbo spring boot starter 一 说明众所周知 阿里早已把 dubbo 捐赠给了 Apache 现在 dubbo 由 Apache 在维护更新 dubbo 也已经成了 Apache 下的顶级项目 所以本 demo 项目所依赖的坐标是 Apache 官方最新的 3 0 4 坐标 dependency groupId org apache dubbo groupId dependency

    2025年11月15日
    2
  • spring中文文档下载_spring基础包

    spring中文文档下载_spring基础包前一段时间翻译了Jetty的一部分文档,感觉对阅读英文没有大的提高(*^-^*),毕竟Jetty的受众面还是比较小的,而且翻译过程中发现Jetty的文档写的不是很好,所以呢翻译的兴趣慢慢就不大了,只能

    2022年8月4日
    6
  • 主成分分析与因子分析及SPSS实现[通俗易懂]

    主成分分析与因子分析及SPSS实现[通俗易懂]主成分分析与因子分析及SPSS实现一、主成分分析(1)问题提出在问题研究中,为了不遗漏和准确起见,往往会面面俱到,取得大量的指标来进行分析。比如为了研究某种疾病的影响因素,我们可能会收集患者的人口学资料、病史、体征、化验检查等等数十项指标。如果将这些指标直接纳入多元统计分析,不仅会使模型变得复杂不稳定,而且还有可能因为变量之间的多重共线性引起较大的误差。有没有一种办法能对信息进行浓缩,减少变量的个…

    2022年5月17日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号