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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Odin Inspector 系列教程 — Enum Toggle Buttons Attribute

    Odin Inspector 系列教程 — Enum Toggle Buttons AttributeEnumToggleButtonsAttribute特性:在水平按钮组中绘制枚举而不是下拉列表。枚举多选按钮主要是应用了System.FlagsusingSirenix.OdinInspector;usingUnityEngine;publicclassEnumToggleButtonsAttributeExample:…

    2022年7月21日
    22
  • 公有云和私有云哪种成本更低

    公有云和私有云哪种成本更低​最新调查表明:在虚拟机运行数量相同的情况下,企业使用私有云比公有云更加节省成本。随着企业对私有云和公有云、云服务器的使用经验加深,很多企业表示已经通过实践把握私有云的部署和正确使用,并在成本方面超越公有云。据著名互联网调查研究公司对150位IT决策者调查显示,41%的受访者表示每个虚拟机运行在私有云基础架构比公共云成本更低。在某些情况下,节省的费用非常惊人。9%的受访者表示,他们在私有云运行…

    2022年6月16日
    31
  • SpringBoot 配置Mybatis两种方式

    SpringBoot 配置Mybatis两种方式目前SpringBoot被各企业广泛使用,在SpringBoot结合Mybatis使用时,有的人将mapper.xml存放到resouce的目录下,有的想把Mapper.xml和接口放到一起,但是这样/就会存在Mapper.xml加载不了,导致方法无法找到,现在咱们看看两种方式的配置。首先说第一种:也就是网上说的最多的一种,添加依赖,我就不细说了。1.在application.pr…

    2022年6月24日
    34
  • J2EE是什么?和JavaEE的是什么关系?「建议收藏」

    J2EE是什么?和JavaEE的是什么关系?「建议收藏」首先,现在很多人看到J2EE会比较懵圈,因为接触的Java一般是JavaSE和JavaEE,其实J2EE在JDK5.0之后改名为了JavaEE,J2SE改为了JavaSE,只是名字上的一个更改而已。Java分三个版本:JavaSE(标准版)、JavaEE(企业版)、JavaME(微型版),其中JavaSE是Java编程语言的基础,JavaEE是用于公司的PC端开发的,而JavaME是用于移动端开发的。那么JavaEE呢,是java面向企业级的版本,主要面向是Web应用,尤其是企..

    2022年10月10日
    6
  • 中国Web应用程序防火墙(WAF)市场现状研究分析与发展前景预测报告「建议收藏」

    中国Web应用程序防火墙(WAF)市场现状研究分析与发展前景预测报告「建议收藏」本文研究中国市场Web应用程序防火墙(WAF)现状及未来发展趋势,侧重分析在中国市场扮演重要角色的企业,重点呈现这些企业在中国市场的Web应用程序防火墙(WAF)收入、市场份额、市场定位、发展计划、产品及服务等。历史数据为2017至2021年,预测数据为2022至2028年。

    2022年5月5日
    98
  • 商汤组了「最强大脑」局,正儿八经解释为啥搞起电竞AI「建议收藏」

    商汤组了「最强大脑」局,正儿八经解释为啥搞起电竞AI「建议收藏」金磊发自凹非寺量子位报道|公众号QbitAI前不久,《星际争霸2》虫王iA周航加入商汤科技,担任AI研究员。堪称电竞职业玩家「转型最成功」的案例之一。而商汤作为一家以计算机视…

    2022年5月16日
    48

发表回复

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

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