python中装饰器修复技术

python装饰器@wraps作用-修复被装饰后的函数名等属性的改变
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),

为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,

它能保留原有函数的名称和docstring。

未加@wraps的时候:

from functools import wraps

def wrapper(func):
    # @wraps(func)
    def inner(*args, **kwargs):
        print("装饰器工作中...")
        func(*args, **kwargs)
    return inner

@wrapper
def f1(arg):
    """
    这是一个测试装饰器修复技术的函数
    :param arg: 随便传
    :return: 没有
    """
    print(arg)

f1('呵呵')
print(f1.__name__,f1.__doc__)

打印结果是:

但是加上@wraps以后:

from functools import wraps

def wrapper(func):
    @wraps(func)
    def inner(*args, **kwargs):
        print("装饰器工作中...")
        func(*args, **kwargs)
    return inner

@wrapper
def f1(arg):
    """
    这是一个测试装饰器修复技术的函数
    :param arg: 随便传
    :return: 没有
    """
    print(arg)

f1('呵呵')
print(f1.__name__,f1.__doc__)

打印结果是:

其中主要的就是两个变量:

1、显示 正在执行的函数的名称 f.name
2、显示 正在执行的函数的注释 f.doc

简单来说就是:

如果没使用@wraps,当A调用了装饰器B的话,即使A.name,返回的会是装饰器B的函数名称,而不是A的函数名称
如果使用了@wraps,当A调用了装饰器B的话,A.__ name__返回的会是A函数的名称,而不是饰器B的名称,
这也即使常说的@wraps是装饰器的修复技术,
实际就是修复还原了A的__ name__变量,同理__ doc__变量也是一样。

原文地址:https://www.cnblogs.com/djdjdj123/p/12181230.html

时间: 2024-11-11 00:51:35

python中装饰器修复技术的相关文章

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

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

8.Python中装饰器是什么?

Python中装饰器是什么? A Python decorator is a specific change that we make in Python syntax to alter functions easily. Python decorator是我们在Python语法中使用的一个特定的更改,可以轻松地改变函数. http://www.cnblogs.com/zoe233/p/7070067.html 装饰器定义: 本质是函数.函数的目的是为了完成特定的功能,那么装饰器的功能是什么呢?

装饰器修复技术

装饰器修复技术,让其更加完美,如果不加这个的话,函数内部会打印装饰器内的注释,加上之后,打印的是被装饰的函数. 装饰器 def login_auth(func): """我是装饰器""" def inner(*args, **kwargs): res = func(*args, **kwargs) return res return inner @login_auth def login(): """我是被装饰的函数

对Python中装饰器(Decorator)的理解与进阶

有时候我们项目中的某些功能做些修改即需要对内部的某些函数添加一些附加功能,但是为了安全起见不想改变函数的源代码以及函数的调用方式,那么装饰器在这个地方会给我们带来很大的帮助. 装饰器(Decorator):(又叫语法糖) 定义:本质是函数,功能(装饰其它函数)就是为其他函数添加附加功能 原则:(1).不能修改被装饰的函数的源代码 (2).不能修改被装饰的函数的调用方式 1.先来实现一个简单的装饰器示例: #!/usr/bin/env python # -*- coding:utf-8 -*- #

Python编程系列---Python中装饰器的几种形式及万能装饰器

根据函数是否传参  是否有返回值 ,可以分析出装饰器的四种形式: 形式一:无参无返回值 1 def outer(func): 2 def wrapper(): 3 print("装饰器功能1") 4 ret = func() 5 print("装饰器功能2") return ret 6 return wrapper 7 8 # 定义一个无参无返回值的函数 9 @outer 10 def main_func(): 11 print("hello")

Python中装饰器(转)

本文由 伯乐在线 - 7even 翻译,艾凌风 校稿.未经许可,禁止转载!英文出处:Simeon Franklin.欢迎加入翻译组. 好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函数调用语法中的特性有所了解.使用装饰器非常简单(见步骤10),但是写装饰器却很复杂. 虽然我没法让装饰器变得简单,但也许通过将问题进行一步步的讲解,可以帮助你更容易理

Python中装饰器的用法

定义: 装饰器本身就是一个函数 为其他函数提供附加功能 不改变源代码 不改变原调用方式 装饰器=高阶函数+嵌套函数 知识点: 函数本身就是一个变量(意味着可以被复制给一个变量:test=test(1) ) 高阶函数 把函数名当成一个实参传递给另一个函数func(test1) (不改变源代码的前提下添加代码) 返回值中包含函数名return deco (不改变函数的调用方式) 嵌套函数:函数中加入新的函数def func1(): def func2(): 典型结构: 1 def func1(tes

python中装饰器的原理

装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕 def outer(func): def inner(): print("认证成功") result=func() print("登录成功") return result return inner@outerdef OA(): print("OA接口") 这里面需要注意的是: @outer和@outer()有区别,没有括号时,ou

python中装饰器你真的理解吗?

def w1(func): print('装饰器1....') def w1_in(): print('w1_in.....') func() return w1_in def w2(func): print('装饰器2.....') def w2_in(): print('w2_in......') func() return w2_in @w1 @w2 def f1(): print('f1....') f1() 你知道上面的代码执行的步骤吗?........................