python基础学习-装饰器进阶
#__author:"Feng Lin" #date: 2018/8/30 #装饰器进阶 # functool.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数 from functools import wraps #给装饰器添加特别的装饰器 print('###不加wraps,用__name__和__doc__等方法无法获取原函数,而是获取的闭包返回的inner###') def wrapper(func): def inner(*args,**kwargs): print('在被装饰函数执行之前的操作') ret=func(*args,**kwargs) print('在被装饰函数执行之后的操作') return ret return inner @wrapper #holiday=wrapper(holiday) def holiday(day): '''这是一个放假通知''' print("这次放假%s天"%day) return "好开心" ret=holiday(3) print(ret) print(holiday.__name__) print(holiday.__doc__) #返回注释 print("#####################################################################") print("###加了wraps可以实现完全对原函数的调用,不会被装饰器影响###") def wrapper(func): @wraps(func) #使用方法 def inner(*args,**kwargs): print('在被装饰函数执行之前的操作') ret=func(*args,**kwargs) print('在被装饰函数执行之后的操作') return ret return inner @wrapper #holiday=wrapper(holiday) def holiday(day): '''这是一个放假通知''' print("这次放假%s天"%day) return "好开心" ret=holiday(3) print(ret) print(holiday.__name__) print(holiday.__doc__) print("################带参数的装饰器,可以传参给装饰器批量控制函数是否使用装饰器#######################") print("######################这里只需要修改flag就可以控制装饰器是否启用#############################") import time flag=True def timer_out(flag): def timer(func): def inner(*args,**kwargs): if flag==True: 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)等价于@timer @timer_out(flag) def bawang(): time.sleep(0.1) print("我是霸王防脱") @timer_out(flag) def wanlaoji(): time.sleep(0.2) print("我是王老吉") @timer_out(flag) def kele(): time.sleep(0.1) print("我是肥仔快乐水") bawang() wanlaoji() kele() print("###多个装饰器装饰一个函数#####################") def wrapper1(func): def inner1(): print('wrapper1,before func') func() print('wrapper1,after func') return inner1 def wrapper2(func): def inner2(): print('wrapper2,before func') func() print('wrapper2,after func') return inner2 @wrapper2 @wrapper1 def f(): print('in f') f()