装饰器的本质是一个闭包函数,作用在于不改变原函数功能和调用方法的基础上给它添加额外的功能.装饰器在装饰一个函数时,原函数就成了一个新的函数,也就是说其属性会发生变化,所以为了不改变原函数的属性,我们会调用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装饰器,保证原函数在执行时不会发生异常.

    

wraps装饰器的作用的更多相关文章

  1. python中functools.wraps装饰器的作用

    functools.wraps装饰器用于显示被包裹的函数的名称 import functools def node(func): #@functools.wraps(func) def wrapped ...

  2. 探究functools模块wraps装饰器的用途

    <A Byte of Python>17.8节讲decorator的时候,用到了functools模块中的一个装饰器:wraps.因为之前没有接触过这个装饰器,所以特地研究了一下. 何谓“ ...

  3. python装饰器的作用

    常见装饰器:内置装饰器:类装饰器.函数装饰器.带参数的函数装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常 ...

  4. python学习笔记2-functools.wraps 装饰器

    wraps其实没有实际的大用处, 就是用来解决装饰器导致的原函数名指向的函数 的属性发生变化的问题: 装饰器装饰过函数func, 此时func不是指向真正的func,而是指向装饰器中的装饰过的函数 i ...

  5. 关于functools模块的wraps装饰器用途

    测试环境:Python3.6.2 + win10 +  Pycharm2017.3 装饰器之functools模块的wraps的用途: 首先我们先写一个装饰器 # 探索functools模块wraps ...

  6. wraps装饰器的使用

    functools模块中的wraps装饰器 说明 使用functools模块提供的wraps装饰器可以避免被装饰的函数的特殊属性被更改,如函数名称__name__被更改.如果不使用该装饰器,则会导致函 ...

  7. python functools.wraps装饰器模块

    # -*-coding=utf-8 -*-#实现一个函数执行后计算执行时间的功能 __author__ = 'piay' import time, functools def foo(): ''' 定 ...

  8. python wraps装饰器

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

  9. python基础一 ------装饰器的作用

    装饰器: 本质属性:为函数增加新功能的函数,只是有个语法糖,显得高大上而已 #装饰器 #引子 计算斐波那契数列,第50 项 import time def fibonacci(num): if num ...

随机推荐

  1. node学习基础

    node特点 js运行时,非阻塞I/O,事件循环 模块导入导出 模块化 导入 require('./xxx') module.exports=xxx index.js module.exports = ...

  2. 在电脑上远程连接你的 云服务器( ECS)

    在与服务器上一般安装的主流操作系统   linux   和   windowsServer linux一般都是centOs系列 这个主要是连接windowsServer 系统 用xshell ,win ...

  3. PHP正则匹配网址

    /** * @param $url 网址 * @return bool */ public static function checkUrl($url){ $pattern="/^(http ...

  4. Spring BeanFactory继承结构图

    结构图 高清大图:https://img2018.cnblogs.com/blog/813478/201910/813478-20191030114422275-1092084932.jpg 源文件( ...

  5. Matlab数据标准化——mapstd、mapminmax

    Matlab神经网络工具箱中提供了两个自带的数据标准化处理的函数——mapstd和mapminmax,本文试图解析一下这两个函数的用法. 一.mapstd mapstd对应我们数学建模中常使用的Z-S ...

  6. Java学习:线程实现方式

    线程实现方式 并发与并行 并发:指两或多个事件在同一个时间段内发生 并行:指两或多个事件在同一个时刻发生(同时发生) 进程的概念 内存:所有的应用程序都需要进入到内存中执行 临时存储RAM 硬盘:永久 ...

  7. spring boot EnableAutoConfiguration exclude 无效

    本文链接:https://blog.csdn.net/ID19870510/article/details/79373386 首先讲一下SpringBootApplication注解源码定义为 @Ta ...

  8. laravel hash密码生成和密码验证

    在laravel中 登录表单中的密码是用hash来生成的. 在生成密码需要用到 laravel框架中的方法(都是laravel封装好了的) bcrypt($password)方法,直接将获取到的pas ...

  9. Syste.IO命名空间下的流操作类之间的关系

  10. 静下心来学jquery的用法

    http://blog.csdn.net/xiaojun1288/article/details/6803552