说明
1、使用装饰器时,原函数似乎没有改变,但其元信息发生了变化——此时的原函数实际上是包裹后的wrapper函数。
2、若要保留原始函数的元信息,可以通过内置@functools.wraps(func)实现。
@functools.wraps(func)的作用是通过update_wrapper和partial将目标函数的元信息复制到wrapper函数中。
实例
# def decorator def decorator_with_args(*args, **kwargs): print('Step1: enter wrapper with args func.') print(args) print(kwargs) def decorator_func(func): @functools.wraps(func) def wrapper(*args, **kwargs): print('Step2: enter wrapper func.') return func(*args, **kwargs) return wrapper return decorator_func
以上就是python装饰器保留原函数信息的方法,希望对大家有所帮助。更多Python学习指路:
本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。
伴沃教育还为您提供以下相关内容希望对您有帮助:
Python笔记:Python装饰器
内置装饰器@functools.wrap可用于保留原函数的元信息(将原函数的元信息,拷贝到对应的装饰器函数里)。先来看看没有使用functools的情况:输出:从上面的输出可以看出test_decorator() 函数被装饰以后元信息被wrapper() 函数取代了,可以使用@functools.wrap装饰器保留原函数的元信息:输出:装饰器可以接受...
请教:python装饰器如何不改变原函数名
装饰器是用在函数不修改添加新功能的情况下诞生的,一般在需要装饰的函数上写 funcname def funb(){ ...} 然后再装饰的函数里面去调用原函数,以达到不修改添加功能的作用
关于python装饰器的问题
1,参数为函数对象 2,使用内部函数 3,返回函数对象 在你的代码中:装饰器函数是arg_func(sex)内部函数是func1()被装饰函数是man()和woman()所以代码要改成:def arg_func(sex):def func1():sex()if(sex.__name__=='man'):print("you can 't")if(sex.__name__=='woman'):print("...
python调用有装饰器的方法怎么能不跑装饰器
1、直接导入原函数所在的模块,然后直接调用原函数。但这种方法可能会导致命名冲突,如果装饰器和原函数同名,那么直接调用原函数会导致运行装饰器。2、使用exec()函数动态执行原函数。这种方法可以绕过装饰器,但需要注意的是,由于exec()函数可以执行任意代码,所以存在一定的安全风险。
python 带可变参数的装饰器怎么用
那你就不可能在得到命令的时候去原函数头部去做删除和添加装饰器调用的命令。这是就可以用到带参数的装饰器,定义一个开关,调用装饰器的时候,把这个装饰器的开关参数给传递进去,这样当开关打开的时候装饰器生效,关闭的时候则只执行原函数的代码。举例:开关参数为True的时候执行过程:F = True #...
不学会装饰器,面试不敢说自己会Python
Python中的装饰器,本质上就是一个高阶 函数 ,这里高阶函数指定就是" 一个返回值是函数的函数 "在python中使用装饰器,有两个组成部分.①@符号调用装饰器 ②定义被装饰的方法 范例如下:装饰器名字 定义被装饰的函数 logger def func(): pass 装饰器可以在不修改函数的情况下,增加额外的功能.这...
python装饰器有什么用
这个问题就比较严重的,好在我们有functools.wraps,wraps本身也是一个装饰器,它能把原函数的元信息拷贝到装饰器函数中,这使得装饰器函数也有和原函数一样的元信息了。from functools import wrapsdef logged(func):@wraps(func)def with_logging(*args, **kwargs):print func.__name__ + " was ...
python装饰器是什么意思
python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。一般而言,我们要想拓展原来函数代码,比较直接的办法就是侵入代码里面修改。而且装饰器是程序开发中经常会用到的一个功能,用...
python装饰器是什么意思
1、先明白这段代码 第一波 def foo():print 'foo'foo #表示是函数 foo() #表示执行foo函数 第二波 def foo():print 'foo'foo = lambda x: x + 1 foo() # 执行下面的lambda表达式,而不再是原来的foo函数,因为函数 foo 被重新定义了 2、需求来了 初创公司有N个业务部门,1...
如何理解 Python
使用装饰器极大地复用了代码,但是他有一个缺点就是原函数的元信息不见了,比如函数的docstring、__name__、参数列表,先看例子:装饰器 def logged(func):def with_logging(*args, **kwargs):print func.__name__ + " was called"return func(*args, **kwargs)return with_logging 函数 logg...