python之闭包与装饰器
1、装饰器前戏之闭包:
闭包的定义:简单来说就是一个内部函数引用了函数外定义的变量,并且该函数可以在其定义环境外被执行。
def foo():
x =10
def inner(): #条件一:inner为一个内部函数
print(x) #条件二:调用外部变量 X
return inner #结论 inner被称为闭包
f=foo() #f 相当于inner
f() #f()相当与inner(); 即 inner()这个内部函数可在外部调用
2、装饰器
装饰器定义:在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator).我的理解是为某个已定义的函数增加某些功能,但是不修改函数原始的定义.
例子:我们先编写一个做加法的函数(add()),此时我们想加一个功能,统计加法函数所执行花费的时间,但是呢又不想修改原始的函数(add()),并且调用时仍然使用add()进行调用
方法一:使用闭包
import time
def showTime(add):#外部函数
def inner(a,b):#闭包条件一:inner为内部函数
start_time=time.time()
add(a,b)#闭包条件二:引用外部函数add
end_time=time.time()
spend_time=end_time-start_time
print("花费时间为:%s"%spend_time)
return inner#结论:inner为闭包
def add(a,b):
sum=a+b
time.sleep(1)
print("%d + %d = %d"%(a,b,sum))
#执行语句
add=showTime(add)#add 相当于inner
add(1,2) #add(1,2) 相当于执行内部闭包函数inner(1,2)

方法二:使用装饰器
import time
def showTime(add):#外部函数
def inner(a,b):#闭包条件一:inner为内部函数
start_time=time.time()
add(a,b)#闭包条件二:引用外部函数add
end_time=time.time()
spend_time=end_time-start_time
print("花费时间为:%s"%spend_time)
return inner#结论:inner为闭包
@showTime #@showTime 相当于 add=showTime(add)
def add(a,b):
sum=a+b
time.sleep(1)
print("%d + %d = %d"%(a,b,sum))
#执行语句
add(1,2)

3、装饰器带参数
import time
def decoratorParameter(flag=1):
def showTime(func):#外部函数
def inner(a,b):#闭包条件一:inner为内部函数
start_time=time.time()
func(a,b)#闭包条件二:引用外部函数
end_time=time.time()
spend_time=end_time-start_time
print("花费时间为:%s"%spend_time)
if flag ==1:
print("flag=1时打印")
return inner#结论:inner为闭包
return showTime
@decoratorParameter(1)
def add(a,b):
sum=a+b
time.sleep(1)
print("%d + %d = %d"%(a,b,sum))
@decoratorParameter(2)
def sub(a,b):
result = a - b
time.sleep(1)
print("%d - %d = %d" % (a, b, result))
#执行语句
add(1,2)
print("*"*50)
sub(2,1)
