我们知道函数被装饰器,装饰后,所有的属性,以及内置函数就失效了,原因是函数类型变成了装饰器返回的函数的类型。
def warfunc(func):
def xy_ret(*args,**kwargs):
print('warpper demo')
ret = func(*args,**kwargs)
return ret
return xy_ret
@warfunc
def demofunc():
print('func demo')
demofunc()
print(demofunc)
"""
warpper demo
func demo
<function warfunc.<locals>.xy_ret at 0x000001FFB0B29318>
"""
从输出结果可以看出,这个函数类型是一个warfunc装饰器返回的xy_ret函数。那么内置函数也失效了。如help(demofunc())。
如果带 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>
"""
本文参考