装饰器的本质是一个闭包函数,作用在于不改变原函数功能和调用方法的基础上给它添加额外的功能.装饰器在装饰一个函数时,原函数就成了一个新的函数,也就是说其属性会发生变化,所以为了不改变原函数的属性,我们会调用functools中的wraps装饰器来保证原函数的属性不变.下边以一个简单的例子展示wraps装饰器的作用 :

    在有wraps的情况下:

from functools import wraps

def test(func):
@wraps(func)
def inner():
'装饰器'
print(inner.__name__,inner.__doc__)
return func()
return inner @test
def func():
'原函数'
print(11111)
print(func.__name__,func.__doc__) func()
# func 原函数
# 11111
# func 原函数

  

    很明显在使用了wraps的情况下当调用func函数时,func的属性并没有说明变化.

    

    在没有wraps装饰的情况下:

from functools import wraps

def test(func):
# @wraps(func)
def inner():
'装饰器'
print(inner.__name__,inner.__doc__)
return func()
return inner @test
def func():
'原函数'
print(11111)
print(func.__name__,func.__doc__) func()
# inner 装饰器
# 11111
# inner 装饰器

    虽然func函数本身的功能没有发生变化,但是__name__已经发生变化,其属性也变成inner函数的属性.

    综上,在进行装饰器的操作时,最好加上wraps装饰器,保证原函数在执行时不会发生异常.

    

最新文章

  1. 【转载】PHP PSR-1 基本代码规范(中文版)
  2. Sprint第三阶段(第三天12.11)
  3. Java数据库连接池封装与用法
  4. mac下忘记mysql密码, 重新设置mysql密码
  5. linux+jre+apache+mysql+tomcat调优
  6. Javascript基础系列之(六)循环语句(do while循环)
  7. Json转换为对象
  8. Form认证导致登陆页面的样式无效和图片不能显示的原因
  9. 【设计模式 - 10】之外观模式(Facade)
  10. MacBook Pro 下Bash Shell 利用Alias 简化命令
  11. SpringMVC 学习-入门篇
  12. android 中判断WiFi是否可用的可靠方法 ,android 是否联网
  13. bootstrap4中文版(纯手工翻译)
  14. php连接memcahed出现Cannot assign requested address (99)的解决方法
  15. 准备在CSDN知识库建立一个Ext JS的知识库
  16. Kubernetes移除node节点
  17. C#正则表达式_简单梳理_Emoji表情字符处理
  18. 【java基础】基础小总结
  19. Ionic构建打包apk出现的问题集合
  20. PHP ini_set

热门文章

  1. CentOS 安装OpenResty
  2. Java学习:迭代器简介
  3. SQL分类之DML:增删改表中的数据
  4. jwt的简单使用
  5. syntax error near unexpected token 脚本报错误解决
  6. css元素水平垂直居中
  7. .NET Core MD5加密 32位和16位
  8. Docker 多终端登录
  9. ubuntu Ifconfig只显示一个lo
  10. java开发中,一些小的JS应用