zoukankan      html  css  js  c++  java
  • dayfunctools.weps 定义函数装饰器

    装饰器(decorator)是干嘛的?对于受到封装的原函数来说,装饰器能够在那个函数执行前或者执行后分别运行一些代码,使得可以再装饰器里面访问并修改原函数的参数以及返回值,以实现约束定义、调试程序、注册函数等目标。装饰器一般返回一个包装器(wrapper),而functools.wraps就是装饰包装器的装饰器。

    先来看一个不使用functools.wraps的装饰器例子。

    def tracer(func):
        def wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
            return result
        return wrapper
    
    @tracer
    def fibonacci(n):
        if n in (0,1):
            return n
        return (fibonacci(n-1)+fibonacci(n-2))
    
    
    fibonacci(3)
    print(fibonacci)
    print('help:')
    help(fibonacci)
    

      输出结果:

    可以看到,装饰器完全可以正常工作。。。

    但是,函数的名字变成装饰器中的包装器了!!!help内置函数也失效了

    也就是说,原函数的属性失效了

    如果想要保留原函数的属性,就可以用到functools.wraps了

    from functools import wraps
    def tracer(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
            return result
        return wrapper
    
    @tracer
    def fibonacci(n):
        if n in (0,1):
            return n
        return (fibonacci(n-1)+fibonacci(n-2))
    
    
    fibonacci(3)
    print(fibonacci)
    print('help:')
    help(fibonacci)
    

      输出结果:

     转自

    http://www.cnblogs.com/fcyworld/p/6239951.html

  • 相关阅读:
    Collections与Arrays
    TreeMap
    HashMap
    单列集合的体系
    泛型的上下限
    09年最受关注的十大Visual Studio插件
    编码中的硬回车与软回车
    无法打开包括文件:'atlrx.h'的解决办法[原]
    【转】Notepad++,Eclipse和Visual Studio 2005常用快捷键对比
    【转】printf格式控制(你所不知道的printf妙用)
  • 原文地址:https://www.cnblogs.com/935415150wang/p/7729213.html
Copyright © 2011-2022 走看看