Python-无参装饰器补充

偷梁换柱:即将原函数名(index)指向的内存地址偷梁换柱成wrapper函数,所以应将wrapper做的跟原函数一样才行(目前满足了 参数、调用方式、返回值)
from functools import wraps  #python的装饰器
def outter(func):

#将wrapper函数做的跟原函数属性一模一样,使用python自带的装饰器,如下。
@wraps(func) #要装饰谁在谁头顶上使用
def wrapper(*args,**kwargs): #1.调用原函数 2.为其增加新功能

res=func(*args,**kwargs) #func()参数要写活,所以func(*args,**kwargs)
return res

#手动将原函数的属性赋值给wrapper函数
#index.__name__没有调用index函数,相当于没有调用wrapper函数。所以就把wrapper函数体关闭
#函数wrapper.__name__=原函数.__name__
# 函数wrapper.__doc__=原函数.__doc__
# wrapper.__name__ = func.__name__
# wrapper.__doc__ = func.__doc__
return wrapper

@outter # index=outter(index)
def index(x,y):
"这是被装饰器对象index函数"
print("index...%s %s"%(x,y))

index(1,2) #其实是wrapper(1,2)

#验证:
print(index.__name__)
print(index)
print(help(index)) #等同于 print(index.__doc__) 查看函数的文档信息
# 有装饰器 无装饰器
# wrapper index
# <function outter.<locals>.wrapper at 0x000000000238C160> <function index at 0x000000000216B670>


#添加完验证
print(index.__name__)
print(index.__doc__)
 
 
posted @ 2020-11-09 14:50  梁博客  阅读(73)  评论(0)    收藏  举报