标签:bing index wrapper 装饰器 bsp int too 运行时 一个
装饰器的功能:在不修改原函数和其调用方式的情况下对原函数功能进行扩展
装饰器的本质是闭包函数
import time def func(): start = time.time() print(‘老板好!同事好!大家好!‘) time.sleep(0.01) end = time.time() print(end-start ) func()
import time def timer(f): start = time.time() f() time.sleep(0.01) end = time.time() print(end - start) def func(): print(‘老板好!同事好!大家好!‘) timer(func)
import time def timer(f): start = time.time() f() time.sleep(0.01) end = time.time() print(end - start) def func(): print(‘老板好!同事好!大家好!‘) func = timer func()
这样修改很完美,但是timer函数需要一个参数,如果在赋值的时候传参, func = timer(func),timer函数就直接执行了,并不能实现
import time def timer(f): #装饰器函数 def inner(): start = time.time() f() #被装饰的函数 time.sleep(0.01) end = time.time() print(end - start) return inner def func(): print(‘老板好!同事好!大家好!‘) func = timer(func) func()
import time def timer(f): def inner(): start = time.time() f() time.sleep(0.01) end = time.time() print(end - start) return inner @timer # 语法糖 相当于func = timer(func) def func(): print(‘老板好!同事好!大家好!‘) # func = timer(func) func()
import time def timer(f): def inner(): start = time.time() ret = f() time.sleep( 0.01) end = time.time() print(end - start) return ret return inner @timer # 语法糖 相当于func = timer(func) def func(): print(‘老板好!同事好!大家好!‘) return ‘新年好‘ # func = timer(func) ret = func() print(ret)
import time def timer(f): def inner(*args,**kwargs): start = time.time() ret = f(*args,**kwargs) time.sleep( 0.01) end = time.time() print(end - start) return ret return inner @timer # 语法糖 相当于func = timer(func) def func(a,b,c): print(‘老板好!同事好!大家好!‘,a,b,c) return ‘新年好‘ # func = timer(func) ret = func(1,2,c=3) #inner print(ret)
def wrapper(f): # f :被装饰的函数 def inner(*args, **kwargs): # 在被装饰函数之前要做的事 ret = f(*args, **kwargs) # 在被装饰函数之后要做的事 return ret return inner @wrapper # 语法糖 @装饰器的函数名 def func(a, b, c): # 被装饰的函数 print(a, b, c) return ‘新年好‘ ret = func(1, 2, c=3) print(ret)
def index(): ‘‘‘这是一个主页信息‘‘‘ print(‘from index‘) print(index.__doc__) #查看函数注释的方法 print(index.__name__) #查看函数名的方法
为函数添加了装饰器,在打印被装饰函数的__name__或__doc__的时候,打印的是装饰器的
def wrapper(f): # f :被装饰的函数 def inner(*args, **kwargs): # 在被装饰函数之前要做的事 ret = f(*args, **kwargs) # 在被装饰函数之后要做的事 return ret return inner @wrapper # 语法糖 @装饰器的函数名 def func(a, b, c): # 被装饰的函数 print(a, b, c) return ‘新年好‘ print(func.__name__) 打印结果: inner
from functools import wraps def wrapper(f): # f :被装饰的函数 @wraps(f) #f:被装饰的函数 def inner(*args, **kwargs): # 在被装饰函数之前要做的事 ret = f(*args, **kwargs) # 在被装饰函数之后要做的事 return ret return inner @wrapper # 语法糖 @装饰器的函数名 def func(a, b, c): # 被装饰的函数 print(a, b, c) return ‘新年好‘ print(func.__name__) 打印结果: func
import time FLAG = True def timer_out(flag): def timer(func): def inner(*args, **kwargs): if flag: start = time.time() ret = func(*args, **kwargs) end = time.time() print(end - start) return ret else: ret = func(*args, **kwargs) return ret return inner return timer @timer_out(FLAG) def beibingyang(): time.sleep(0.1) print(‘beibingyang‘) @timer_out(FLAG) def erguotou(): time.sleep(0.1) print(‘erguotou‘) beibingyang() erguotou()
@timer_out(FLAG) 分为两部分:
@:为一部分
timer_out(FLAG):为一部分
timer_out(FLAG)执行时返回inner,此时@timer_out(FLAG)为@inner
@inner 为 beibingyang= timmer(beibingyang)
当FLAG改为False装饰器就失效了,这样添加和取消都比较便捷
def wrapper1(func): #第一步执行后 func=f def inner1(): print(‘wrapper1 ,before func‘) #第六步 输出 wrapper1 ,before func func() #第七步 调用 f print(‘wrapper1 ,after func‘) #第八步 输出 wrapper1 ,before func return inner1 def wrapper2(func): #第二部执行后 func=inner1 def inner2(): print(‘wrapper2 ,before func‘) # 第四步 输出 wrapper2 ,before func func() #第五部 调用inner1 print(‘wrapper2 ,after func‘) #第九步 输出 wrapper2 ,before func return inner2 @wrapper2 #第二步执行 f=wrapper2(f) 返回inner2 f=inner2 @wrapper1 #第一步执行 f=wrapper1(f) 返回 inner1 f=inner1 def f(): print(‘in f‘) f() #第三步执行 f() 此时f为inner2 调用inner2
打印结果
wrapper2 ,before func wrapper1 ,before func in f wrapper1 ,after func wrapper2 ,after func
标签:bing index wrapper 装饰器 bsp int too 运行时 一个
原文地址:https://www.cnblogs.com/wanglan/p/10306276.html