zoukankan      html  css  js  c++  java
  • python wraps装饰器

    这是一个很有用的装饰器。看过前一篇反射的朋友应该知道,函数是有几个特殊属性比如函数名,在被装饰后,上例中的函数名foo会变成包装函数的名字 wrapper,如果你希望使用反射,可能会导致意外的结果。这个装饰器可以解决这个问题,它能将装饰过的函数的特殊属性保留。

    import time
    import functools
     
    def timeit(func):
        @functools.wraps(func)
        def wrapper():
            start = time.clock()
            func()
            end =time.clock()
            print 'used:', end - start
        return wrapper
     
    @timeit
    def foo():
        print 'in foo()'
     
    foo()
    print foo.__name__

    首先注意第5行,如果注释这一行,foo.__name__将是'wrapper'。另外相信你也注意到了,这个装饰器竟然带有一个参数。实际上,他还有 另外两个可选的参数,assigned中的属性名将使用赋值的方式替换,而updated中的属性名将使用update的方式合并,你可以通过查看 functools的源代码获得它们的默认值。对于这个装饰器,相当于wrapper = functools.wraps(func)(wrapper)。

     # -*- coding=utf-8 -*- 
    
    from functools import wraps   
    
    def my_decorator(func):
    
        @wraps(func)
    
        def wrapper(*args, **kwargs):
    
            print('Calling decorated function...')
    
            return func(*args, **kwargs)
    
        return wrapper  

    @my_decorator
    def example(): """Docstring""" print('Called example function') print(example.__name__, example.__doc__)

    打印出:example Docstring

  • 相关阅读:
    获取显卡的cuda算力
    ubuntu安装gitlab
    TensorFlow的Bazel构建文件结构
    如何在制作jar包时引用第三方jar包
    利用Shell脚本将MySQL表中的数据转化为json格式
    恢复MySQL主从数据一致性的总结
    (转)运维角度浅谈MySQL数据库优化
    JDBC常用API小结
    MySQL存储过程及触发器
    坑爹的Maven
  • 原文地址:https://www.cnblogs.com/yasmi/p/4760278.html
Copyright © 2011-2022 走看看