一、什么是装饰器?
装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
二、强调装饰器的原则:
1 不修改被装饰对象的源代码
2 不修改被装饰对象的调用方式
3:在遵循1和2的前提下,为被装饰对象添加上新功能
三、装饰器的使用:
import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper @timmer # 相当于 foo = timmer(foo) def foo(): time.sleep(3) print('from foo') foo()
def add(adds): #新增一个参数,接收装饰器传来的值 def decor(func): print(adds) def inner(*arg , **kw): print('我是函数decor') result = func(*arg , **kw) print(adds) #打印装饰器中的值 return result return inner return decor #闭包 # @decor show = decor(show) @add('我是新加的参数adds') #相当于返回decor函数,return decor def show(*arg , **kw): print('我是函数show') print('我是函数show中的参数name:',arg,'我是函数show中的参数age:',kw) return '我是函数show中的返回值' ret= show(*'xiaobo' , **{'zidian':25}) #*把'xiaobo'转换为元组 ,**把字典传进去 print(ret)
def decor(func): def inner(name,age): print('我是decor') # 在函数之前执行的功能 return func(name,age) # 被装饰的函数 return inner @decor def show(name , age): print('我是函数show') print('我是函数show中的参数name:',name,'我是函数show中的参数age:',age) return '我是函数show中的返回值' show('alex',20)