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)
 


 
 
原文地址:https://www.cnblogs.com/hhqdsj/p/12807605.html