一:装饰器的作用就是在原来函数的基础上增加了一些扩展的功能,因为我们开始写的函数已经投入应用了,所以不能对原函数进行修改,也不能修改对它的调用方式,即“开放封闭原则”,封闭:就是说不能对已经使用的函数进行任何修改;开放:就是说虽然不能对原函数进行修改,但是我们可以进行扩展,以增加新的功能。当然我们也可以在执行某些函数之前需要执行其它固定函数,也可以作为装饰器函数的应用,比如登陆操作,无论进入那个功能函数,都需要提前进行登陆,所以可以把登陆功能作为其它功能函数的装饰器来用。
example 1:需求:对已经投入使用的函数 foo() 增加了一个函数运行时间的功能,并且不能改变其原来的调用方式。
1 # 需求:在不改变调用方式的情况下,给要求的函数加上计算执行时间的功能 2 3 import time 4 5 def show_time(f): 6 def inner(): 7 start = time.time() 8 f() 9 end = time.time() 10 print('spend %s' % (end - start) ) 11 return inner 12 13 @show_time # foo = show_time(foo) 14 def foo(): 15 print('foo...') 16 time.sleep(2) 17 18 foo() # 仍以原来的方式进行调用
example 2:对功能函数和装饰器函数加入参数,对装饰器加参数,我们需要再嵌套一层循环,这样就可以引入一个参数。
1 # 需求:在不改变调用方式的情况下,给要求的函数加上计算执行时间的功能 2 3 import time 4 5 def logger(flag = 'Flase'): # 装饰器函数传入参数 6 def show_time(f): # 不能直接在这个函数中加入参数,因为装饰器格式是定好的 7 def inner(x,y): # 给功能函数加参数要传入形参 8 start = time.time() 9 f(x,y) # 对 f 的访问为闭包,给功能函数加参数要传入形参 10 end = time.time() 11 print('spend %s' % (end - start) ) 12 if flag == 'true': 13 print('日志记录') 14 return inner 15 return show_time #需要多加一个返回,返回值为嵌套的最外层函数 16 17 @logger('true') # == @show_time add = show_time(add) 18 def add(x,y): 19 time.sleep(2) 20 print(x + y) 21 22 add(1,2)
example 3:如果装饰器函数不需要参数的话,那么只需要给功能函数加如参数就可以了。
1 import time 2 3 def show_time(f): 4 def inner(x,y): # 给功能函数加参数要传入形参 5 start = time.time() 6 f(x,y) # 对 f 的访问为闭包,给功能函数加参数要传入形参 7 time.sleep(1) 8 end = time.time() 9 print('spend %s' % (end - start) ) 10 return inner 11 12 @show_time # foo = show_time(foo) 13 def foo(x,y): 14 print('result:',x + y) 15 16 foo(1,2)