<代码> def示踪(函数): def包装器(* args, * * kwargs): 结果=func (* args, * * kwargs) 打印(' % s r (r %, %)→% r ' % (func.__name__, args, kwargs,结果)) 返回结果 返回包装 @tracer def斐波纳契(n): 如果n (0, 1): 返回n 返回(斐波纳契(n - 1) +斐波纳契(n - 2)) 斐波纳契(3) 打印(斐波那契) print('帮助:') 帮助(斐波那契)代码>
从执行结果看到:最后的函数对象,变成了包装,而并非斐波那契函数对象。
因fibonacchi函数在装饰器后,包装对象赋值给了斐波那契函数对象,即fibnacchi=包装。
functools.wraps的使用:
也就是说,原函数的属性失效了
如果想要保留原函数的属性,就可以用到functools.wraps了
<代码>从functools进口包装 def示踪(函数): @wraps(函数) def包装器(* args, * * kwargs): 结果=func (* args, * * kwargs) 打印(' % s r (r %, %)→% r ' % (func.__name__, args, kwargs,结果)) 返回结果 返回包装 @tracer def斐波纳契(n): 如果n (0, 1): 返回n 返回(斐波纳契(n - 1) +斐波纳契(n - 2)) 斐波纳契(3) 打印(斐波那契) print('帮助:') 帮助(斐波那契)代码>
functools。包装在执行之后,重新将函数赋值给原函数:包装=fibonacchi。