装饰器

1.闭包
闭包定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,
那么内部函数就被认为是闭包(closure)
关于闭包:闭包=函数块+定义函数时的环境
def outer():
x=10
def inner(): #条件一:内部函数
print(x) #条件二:外部环境变量
return inner #结论:内部函数inner就是一个闭包
#outer()()
#f=outer()
#f()
#inner() #局部变量,全局无法调用
2.装饰器:单个函数块单个加@
(例:show_time()函数为装饰器部分)
import time
# time.sleep(1)

def foo():
# start = time.time()
print('foo...')
time.sleep(2)
# end = time.time()
# print(end - start)
def show_time(f):
start = time.time()
f()
end = time.time()
print('spend %s'%(end-start))
show_time(foo)
装饰器:
import time
# time.sleep(1)
def foo():
# start = time.time()
print('foo...')
time.sleep(2)
# end = time.time()
# print(end - start)
def show_time(f):
def inner():
start = time.time()
f()
end = time.time()
print('spend %s'%(end-start))
return inner
foo=show_time(foo)
foo()
简写:
import time
# time.sleep(1)
def show_time(f):
def inner():
start = time.time()
f()
end = time.time()
print('spend %s'%(end-start))
return inner
@show_time #等价于foo=show_time(foo)
def foo():
# start = time.time()
print('foo...')
time.sleep(2)
# end = time.time()
# print(end - start)
foo()
被装饰函数的参数:
import time
def show_time(f):
def inner(x,y):
start = time.time()
f(x,y)
end = time.time()
print('spend %s'%(end-start))
return inner
@show_time
def add(a,b):
print(a+b)
time.sleep(1)
add(1,2)
接收任意参数:
import time
def show_time(f):
def inner(*x,**y):
start = time.time()
f(*x,**y)
end = time.time()
print('spend %s'%(end-start))
return inner
@show_time
def add(*a,**b):
sums=0
for i in a:
sums = sums + i
print(sums)
time.sleep(1)
add(1,2,3,4,5)
装饰器函数的参数:
import time
#功能函数加参数
def logger(flag=''):
def show_time(f):
def inner(*x,**y):
start = time.time()
f(*x,**y)
end = time.time()
print('spend %s'%(end-start))
if flag == 'true':
print('日记记录')
return inner
return show_time
@logger('true') #add=show_time(add)
def add(*a,**b):
sums=0
for i in a:
sums = sums + i
print(sums)
time.sleep(1)
add(1,2,3,4,5)
@logger()
def bar():
print('bbb...')
time.sleep(2)
bar()
posted @ 2019-01-23 16:58  HashFlag  阅读(123)  评论(0)    收藏  举报