title: Python装饰器中@wraps作用 #标题tags: #标签
date: 2022-01-12
categories: python # 分类

  • 装饰器作用:在不改变原有功能代码的基础上,添加额外的功能,如用户验证等。
  • @wraps(view_func)的作用: 不改变使用装饰器原有函数的结构(如name, doc)

1、不使用@wraps装饰器时候,看看__name____doc__输出的内容是什么:

  1. def decorator(func):
  2. """this is decorator __doc__"""
  3. def wrapper(*args, **kwargs):
  4. """this is wrapper __doc__"""
  5. print("this is wrapper method")
  6. return func(*args, **kwargs)
  7. return wrapper
  8. @decorator
  9. def test():
  10. """this is test __doc__"""
  11. print("this is test method")
  12. print("__name__: ", test.__name__) # 打印结果:__name__: wrapper
  13. print("__doc__: ", test.__doc__) # 打印结果:__doc__: this is wrapper __doc__

分析: 对test()方法进行装饰时候,实际上是执行了test = decorator(test),返回的是wrapper方法的引用,也就是让test指向了wrapper方法,所以调用test.__name__, 实际上是wrapper.__name__,这样子可能会造成后面查找该方法的名字已经注释时候会得到装饰器的内嵌函数的名字和注释。

2、 使用@wraps装饰器解决这个问题

  1. from functools import wraps
  2. def decorator(func):
  3. """this is decorator __doc__"""
  4. @wraps(func)
  5. def wrapper(*args, **kwargs):
  6. """this is wrapper __doc__"""
  7. print("this is wrapper method")
  8. return func(*args, **kwargs)
  9. return wrapper
  10. @decorator
  11. def test():
  12. """this is test __doc__"""
  13. print("this is test method")
  14. print("__name__: ", test.__name__) # __name__: test
  15. print("__doc__: ", test.__doc__) # __doc__: this is test __doc__