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/165061.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月29日 上午11:16
下一篇 2022年7月29日 上午11:16


相关推荐

  • pycharm双击无响应,打不开问题解决办法

    pycharm双击无响应,打不开问题解决办法解决办法转载 我今天一不小心就把 pycharm 搞坏了 重装后 发现打不开 还好中国网友个个都是大神 在网上找到了方法 还好还好 于是来分享一下

    2026年3月26日
    3
  • CNCF 项目毕业标准

    CNCF 项目毕业标准版本 1 2CNCF 毕业标准 1 2 版本 CNCFGraduati 2 每个 CNCF 项目都有成熟度 拟议的 CNCF 项目应说明他们的首选成熟度 一个孵化或毕业项目需要三分之二的绝对多数选票 如果没有绝对多数选票作为毕业项目 那么毕业选票会被计算为孵化选票 如果没有绝对多数选票作为孵化项目 则任何毕业或孵化选票都会被计算为赞助沙箱 如果没有足够的赞助作为沙箱阶段项目 该项

    2026年3月19日
    3
  • coff格式

    coff格式COFF 通用对象文件格式 CommonObject 是一种很流行的对象文件格式 注意 这里不说它是 目标 文件 是为了和编译器产生的目标文件 o obj 相区别 因为这种格式不只用于目标文件 库文件 可执行文件也经常是这种格式 大家可能会经常使用 VC 吧 它所产生的目标文件 obj 就是这种格式 其它的编译器 如 GCC GNUCompilerC

    2026年3月17日
    1
  • 聊聊SQL语句中 DDL 、DML 、DQL 、DCL 分别是什么

    聊聊SQL语句中 DDL 、DML 、DQL 、DCL 分别是什么分别介绍数据库中 DDL DML DQL DCL 这四者的概念 区别

    2026年3月26日
    1
  • intellij idea 激活码[最新免费获取]「建议收藏」

    (intellij idea 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsaWN…

    2022年3月26日
    60
  • 验证码VerifyCode

    验证码VerifyCodeVerifyCode.java:测试:运行后会在指定文件路径下生成一张图片,以及在控制台打印图片上的文本。

    2022年7月1日
    32

发表回复

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

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