网站开发中系统部署与维护要求,网站建设与管理这门课程的介绍,内江网络推广公司,大型网站维护费用Python之装饰器-带参装饰器
带参装饰器
之后不是一个单独的标识符#xff0c;是一个函数调用函数调用的返回值又是一个函数#xff0c;此函数是一个无参装饰器带参装饰器#xff0c;可以有任意个参数 func()func(1)func(1, 2) def add(x, y):函数说明之后不是一个单独的标识符是一个函数调用函数调用的返回值又是一个函数此函数是一个无参装饰器带参装饰器可以有任意个参数 func()func(1)func(1, 2) def add(x, y):函数说明参数说明返回值说明pass# 先写一段伪代码add.__name__, add.__doc__# add的名字是什么add的文档是什么
# 返回结果(add, \n 函数说明\n \n 参数说明\n 返回值说明\n )help(add) # 查看帮助# add的名字是什么add的文档是什么
# 返回结果Help on function add in module __main__:# 返回结果add(x, y)
# 返回结果 函数说明# 返回结果 参数说明
# 返回结果 返回值说明import datetime # 导入datetime模块start datetime.datetime.now() # 开始时间
end datetime.datetime.now() # 结束时间def logger(wrapped):def wrapper(*args, **kwargs):wrapper start datetime.datetime.now()ret wrapped(*args, **kwargs)delta (datetime.datetime.now() - start).total_seconds()print({} tooks {}s..format(wrapped.__name__, delta))return retwrapper.__name__ wrapped.__name__ # 通过这行使装饰器装的更像wrapper.__doc__ wrapped.__doc__return wrapperlogger # 等价式 add logger(add) # logger应该等效为单参函数
def add(x, y): # add wrapperadd description~~#time.sleep(2)return x yprint(add(4, 5)) # 非侵入代码完成了功能并且好像从来没有装饰过一样
print(add.__name__, add.__doc__)# 此为无参装饰器已次代码为例演示带参装饰器。
# 返回结果add tooks 4e-06s.
# 返回结果9
# 返回结果add add description~~# def update(wrapper, wrapped):
# wrapper.__name__ wrapped.__name__ # 通过这行使装饰器装的更像
# wrapper.__doc__ wrapped.__doc__
# 可以通过函数来调用因为重复使用不需要每次都创建写到函数外方便调用# def update(src, dest): # 见名知意这样写src源dest目标
# dest.__name__ src.__name__
# dest.__doc__ src.__doc__# from functools import update_wrapper # python内置函数调用from functools import update_wrapper, wraps # 装饰器版本def logger(wrapped):wraps(wrapped) # 装饰器版本def wrapper(*args, **kwargs):wrapper start datetime.datetime.now()ret wrapped(*args, **kwargs)delta (datetime.datetime.now() - start).total_seconds()print({} tooks {}s..format(wrapped.__name__, delta))return ret#wrapper.__name__ wrapped.__name__ # 通过这行使装饰器装的更像#wrapper.__doc__ wrapped.__doc__#update(wrapper, wrapped)#update(wrapped, wrapper)#update_wrapper(wrapper, wrapped) # 调用return wrapperlogger # 等价式 add logger(add) # logger应该等效为单参函数
def add(x, y): # add wrapperadd description~~#time.sleep(2)return x yprint(add(4, 5)) # 非侵入代码完成了功能并且好像从来没有装饰过一样
print(add.__name__, add.__doc__)# 带参装饰器的对比解释版本
# 返回结果add tooks 6e-06s.
# 返回结果9
# 返回结果add add description~~from functools import update_wrapper, wrapsdef logger(wrapped):wraps(wrapped) # 等价式 wrapper wraps(wrapped)(wrapper) # partial function(偏函数)def wrapper(*args, **kwargs):wrapper start datetime.datetime.now()ret wrapped(*args, **kwargs)delta (datetime.datetime.now() - start).total_seconds()print({} tooks {}s..format(wrapped.__name__, delta))return retreturn wrapperlogger # 等价式 add logger(add) # logger应该等效为单参函数
def add(x, y): # add wrapperreturn x ylogger
def sub(x, y):return x - y#print(add(5, 4))
#print(sub(5, 4))
print(add.__name__, sub.__name__)# 函数函数执行过程函数作用域形参实参解构嵌套函数LEGB、高阶柯里化闭包
# 返回结果add sub