很多python代码中有一个默认装饰器,大概的样子为如下:
@wraps(func)
@functools.wraps(func)
然而去掉这个装饰器程序运行也不受影响,所以非常疑惑这个装饰器的作用,所以写了如下的测试代码:
# coding = utf-8 from functools import wraps def decoretor(func): def wrapper(*args, **kwargs): '''my decoretor''' return func(*args, **kwargs) return wrapper @decoretor def myfunc(): '''my function''' print('my function') if __name__ == '__main__': print((myfunc.__doc__, myfunc.__name__))
这个代码的执行输出为:
('my decoretor', 'wrapper')
这说明myfunc()函数被装饰@decoretor装饰后,myfun()失去了本身的属性,编程了装饰器函数内部的属性,这样就改变了myfunc函数的本身的属性。再查看代码和调试的时候会产生歧义,所以我们需要消除这种歧义,所以使用@wrapper装饰器来做这个工作,看下面代码的输出:
# coding = utf-8 from functools import wraps def decoretor(func): @wraps(func) def wrapper(*args, **kwargs): '''my decoretor''' return func(*args, **kwargs) return wrapper @decoretor def myfunc(): '''my function''' print('my function') if __name__ == '__main__': print((myfunc.__doc__, myfunc.__name__))
这个代码的执行结果为
('my function', 'myfunc')
所以加入代码@wraps(func)后,用decoretor再装饰myfunc代码后,还是原来myfunc的属性。