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

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


相关推荐

  • matlab fmincon优化,matlab fmincon优化问题[通俗易懂]

    matlab fmincon优化,matlab fmincon优化问题[通俗易懂]程序出现如下问题,—options.MaxFunEvals=400(thedefaultvalue).论文时间紧张,有时间的同学可以看一下吗?谢谢x0=[100;100;100;100];A=[];b=[];Aeq=[1,1,1,1];beq=[2000];VLB=[300;400;0;0];VUB=[600;1000;500;500];[x,fval]…

    2022年6月9日
    28
  • 卸载tensorflow的CPU版本并安装GPU版本「建议收藏」

    卸载tensorflow的CPU版本并安装GPU版本「建议收藏」一,卸载CPU版本,如下图之前我已经安装了anaconda,现在检查它的版本以及环境。发现有tensorflow环境,但我需要tensorflow-gpu的环境,所以输入condauninstalltensorflow卸载了,如果发现卸不掉就anaconda页面中点enviroments,选择tensorflow点击下面的remove就可以卸载干净。再次输入condain…

    2022年6月22日
    197
  • Java Serialized 序列化 作用

    今天在看设计模式时,看到迪米特法则时,有一点,谨慎使用Serialized:一个项目中使用远程方法调用方式传递一个VO(值对象),这个对象就必须实现Serialized接口,也就是把需要网络传输的对象进行序列化,否则会出现NotSerialiableException异常。若VO修改了一个属性的权限,由private改为public访问权限变大了,如果服务器上没有做出相应的变更,就会报…

    2022年4月4日
    71
  • THINKPHP and or 模板语句书写

    THINKPHP and or 模板语句书写THINKPHP and or 模板语句书写

    2022年4月21日
    50
  • docker修改mysql配置

    docker修改mysql配置Docker修改MySQL配置作者:YoungJ前言:大部分程序员在刚使用docker时,按照教程迅速的就装完了mysql,在使用的过程中出现各种问题:比如中文乱码、com.mysql.jdbc.PacketTooBigException:Packetforqueryistoolarge(1053>1024).等等,最简单的方式通过sql去设置,但每次重启又还原了,…

    2022年5月18日
    50
  • 机器学习中的数学——常用概率分布(十一):狄利克雷分布(Dirichlet分布)[通俗易懂]

    机器学习中的数学——常用概率分布(十一):狄利克雷分布(Dirichlet分布)[通俗易懂]狄利克雷分布是关于一组ddd个连续变量xi∈[0,1]x_i\in[0,1]xi​∈[0,1]的概率分布,∑ixi=1\sum_ix_i=1∑i​xi​=1。令μ=(μ1,μ2,⋯ ,μd)\mu=(\mu_1,\mu_2,\cdots,\mu_d)μ=(μ1​,μ2​,⋯,μd​),参数α=(α1,α2,⋯ ,αd)\alpha=(\alpha_1,\alpha_2,\cdots,\alpha_d)α=(α1​,α2​,⋯,αd​),其中αi>0\alpha_i>0αi​>

    2025年11月4日
    2

发表回复

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

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