通俗理解@functools.wraps()
功能
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和函数属性
不加wraps
def my_decorator(func): def wrapper(*args, **kwargs): '''decorator''' print('Calling decorated function...') return func(*args, **kwargs) return wrapper @my_decorator def example(): """Docstring""" print('Called example function') print(example.name, example.doc)
13
1 def
my_decorator ( func ): 2
def
wrapper ( * args , ** kwargs ): 3
'''decorator''' 4
print ( 'Calling decorated function...' ) 5
return
func ( * args , ** kwargs ) 6
return
wrapper 7 8 @my_decorator 9 def
example (): 10
"""Docstring""" 11
print ( 'Called example function' ) 12 13 print ( example . name , example . doc )
运行结果
wrapper decorator
1 wrapper
decorator
加上wraps
import functools def my_decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): '''decorator''' print('Calling decorated function...') return func(*args, **kwargs) return wrapper @my_decorator def example(): """Docstring""" print('Called example function') print(example.name, example.doc)
17
1 import
functools 2 3 4 def
my_decorator ( func ): 5
@functools . wraps ( func ) 6
def
wrapper ( * args , ** kwargs ): 7
'''decorator''' 8
print ( 'Calling decorated function...' ) 9
return
func ( * args , ** kwargs ) 10
return
wrapper 11 12 @my_decorator 13 def
example (): 14
"""Docstring""" 15
print ( 'Called example function' ) 16 17 print ( example . name , example . doc )
运行结果 example Docstring
1 example
Docstring