python装饰器中的@wraps

python装饰器中的@wraps

第一段代码:没有添加@wraps

def user_login_confirm(name):
    print(‘我是‘, name)
    def deco_fun(view_func):
        print(‘准备变身。。。‘)
        def wrapper():
            view_func()
            print(‘变身完成。。。‘)
        return wrapper
    return deco_fun

@user_login_confirm(‘小辣椒‘)
def tony():
    print(‘我是‘, tony.__name__)

tony()

运行结果:

我是 小辣椒
准备变身。。。
我是 wrapper
变身完成。。。

第二段代码:多加一个tony函数

def user_login_confirm(name):
    print(‘我是‘, name)
    def deco_fun(view_func):
        print(‘准备变身。。。‘)
        def wrapper():
            view_func()
            print(‘变身完成。。。‘)
        return wrapper
    return deco_fun

@user_login_confirm(‘小辣椒‘)
def tony():
    print(‘我是‘, tony.__name__)

def tony():
    print(‘我是‘, tony.__name__)

tony()

运行结果:

我是 小辣椒
准备变身。。。
我是 tony

第三段代码:添加了@wraps

from functools import wraps

def user_login_confirm(name):
    print(‘我是‘, name)
    def deco_fun(view_func):
        print(‘准备变身。。。‘)
        @wraps(view_func)
        def wrapper():
            view_func()
            print(‘变身完成。。。‘)
        return wrapper
    return deco_fun

@user_login_confirm(‘小辣椒‘)
def tony():
    print(‘我是‘, tony.__name__)

tony()

结论:
装饰器将被装饰函数变为了wrapper函数,连函数名也变了,通过@wraps(func)可以让函数名变回来。

原文地址:https://blog.51cto.com/14265713/2425267

时间: 2024-08-26 13:06:58

python装饰器中的@wraps的相关文章

python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变

Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用.写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring.废话不多说,上俩栗子就能搞明白! 实例一: 不加wraps # -*- coding=utf-8 -*- from functools imp

python3 装饰器修复技术@wraps到底是什么?

Python 装饰器中的@wraps的作用:    装饰器的作用:    在不改变原有功能代码的基础上,添加额外的功能,如用户验证等    @wraps(view_func)的作用:     不改变使用装饰器原有函数的结构(如__name__, __doc__)    不使用wraps可能出现的ERROR:   view_func...endpoint...map... 如果没使用@wraps,当A调用了装饰器B的话,即使A.name,返回的会是装饰器B的函数名称,而不是A的函数名称如果使用了@

python 装饰器及标准库functools中的wraps

最近在看 flask的视图装饰器 时,忽然想起预(复)习一下python的装饰器. 这里有一篇比较好的讲解装饰器的书写的 Python装饰器学习(九步入门) . 这里不单独记录装饰器的书写格式了,重点是工作流程. 首先常见的 装饰器 格式就是通过@语法糖,简便的写法,让流程有些不太清楚. 装饰器不带参数的情况下: def deco(func):     def _deco():         print("before myfunc() called.")         func(

对Python装饰器的个人理解方法

0.说明 在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快忘记,其实本质上还是没有多花时间去搞懂其中的细节问题. 虽然网络上已经有很多这样的文章,但显然都是别人的思想,因此自己总是记不牢,所以花点时间自己好好整理一下. 最近在对<Python核心编程>做总结,收获了不少,下面分享一下我自己对于Python装饰器的理解,后面还提供了一个较为复杂的P

深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去.但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条

python装饰器Decorators

http://blog.csdn.net/pipisorry/article/details/41902599 Introduction 装饰器Decorators是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能.装饰器用于在不改变原函数代码的情况下修改已存在的函数.常见场景是增加一句

python 装饰器、内部函数、闭包简单理解

python内部函数.闭包共同之处在于都是以函数作为参数传递到函数,不同之处在于返回与调用有所区别. 1.python内部函数 python内部函数示例: def test(*args): def add(*args): # 显示的调用外部函数的参数 return args return add(*args) # 返回内部函数的直接调用 运行结果如下: test(1,2,3) (1,2,3) 内部函数直接引用外部函数参数,外部函数test显示的返回内部函数add的调用.当需要在函数内部多次执行复

Python装饰器的学习笔记(转载)

Python装饰器的学习笔记 2017-05-18 程序员共读 来自:标点符的<Python装饰器的学习笔记> 链接:http://www.biaodianfu.com/python-decorator.html 原文:http://stackoverflow.com/questions/739654/how-to-make-a-chain-of-function-decorators-in-python#answer-1594484 装饰器(decorator)是一种高级Python语法.可

自己编写一个装饰器中的装饰器函数

看了"大道曙光"的<探究functools模块wraps装饰器的用途>的文章.基本上弄清了wraps的工作原理,为了检验一下自己理解的程度,于是动手写一个类似的 wraps函数,请大家指教. #!/usr/bin/env python # -*- coding: utf-8 -*- #filename : mywrapper.py #date: 2017-06-02 ''' wrapper function by my code.''' import functools i