python装饰器扩展之functools.wraps

时间:2022-04-21 18:21:02

我们知道函数被装饰器,装饰后,所有的属性,以及内置函数就失效了。

原因是函数类型变成了warpper类型

示例1:不带wraps装饰器示例

def warfunc(func):
def warpper(*args,**kwargs):
print('warpper demo')
ret = func(*args,**kwargs)
return ret
return warpper @warfunc
def demofunc():
print('func demo') demofunc()
print(demofunc)

输出结果:

D:\python36\python3.exe D:/untitled4/temp7.py
warpper demo
func demo
<function warfunc.<locals>.warpper at 0x035432B8>

**从输出结果标记红色部分可以看出,这个函数类型是一个warpper装饰器。那么内置函数也失效了。如help(demofunc())

示例2:带wraps装饰器的

from functools import wraps

def warfunc(func):
@wraps(func)
def warpper(*args,**kwargs):
print('warpper demo')
ret = func(*args,**kwargs)
return ret
return warpper @warfunc
def demofunc():
print('func demo') demofunc()
print(demofunc)

输出结果:

D:\python36\python3.exe D:/untitled4/temp7.py
warpper demo
func demo
<function demofunc at 0x038632B8>

**从输出结果标记红色部分,可以看出,这个类型是一个funciton;需要注意的引用包from functools import wraps