装饰器的本质 :
一个闭包函数
装饰器的功能 :
在不修改原函数以及其调用方法的基础上对原函数进行功能的添加和扩展
装饰器原则 :
开放封闭原则
对扩展是开放的
对修改是封闭的
装饰器的简单版本 :
import time def func1(): #原函数 print('in func1') def timer(func): #定义函数(装饰器函数), 将原函数对象作为参数传给新函数 def inner(): start = time.time() #原函数执行之前做一些操作 func() #原函数执行 print(time.time() - start) #原函数执行之后做一些操作 return inner #将内部函数对象返回给外部函数 func1 = timer(func1) #将自定义的函数(装饰器函数)重新赋值给原函数名 func1() #使用赋值之后的函数调用, 函数名没变 #装饰器的语法糖 import time def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner @timer #==> func1 = timer(func1) def func1(): print('in func1') func1()
带参数的装饰器 :
def timer(func): def inner(a): start = time.time() func(a) print(time.time() - start) return inner @timer def func1(a): print(a) func1(1) #接任意参数的装饰器 import time def timer(func): def inner(*args,**kwargs): start = time.time() re = func(*args,**kwargs) print(time.time() - start) return re return inner @timer #==> func1 = timer(func1) def func1(a,b): print('in func1') @timer #==> func2 = timer(func2) def func2(a): print('in func2 and get a:%s'%(a)) return 'fun2 over' func1('aaaaaa','bbbbbb') print(func2('aaaaaa'))
带返回值的装饰器 :
import time def timer(func): def inner(*args,**kwargs): start = time.time() re = func(*args,**kwargs) print(time.time() - start) return re return inner @timer #==> func2 = timer(func2) def func2(a): print('in func2 and get a:%s'%(a)) return 'fun2 over' func2('aaaaaa') print(func2('aaaaaa'))