装饰器的学习先要理解三个地方
1.作用域
L E G B 优先次序
2.高阶函数(满足下面任意一条叫做高阶函数)
函数名可以进行赋值
函数名可以作为函数参数,还可以作为函数的返回值
3.闭包
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
(通过外层变量控制内层变量)
下面开始讲程序的功能
1、如何调用inner,内部的函数,加上两个括号或者把外部函数赋值给另外一个变量调用时把赋值的变量上面加上括号就行了
2、时间模块的使用
import time #调用时间函数
start = time.time() #可以拿到此时此刻的时间,记得打括号
time.sleep(1) #延迟1秒
end = time.time()
print(end-start)
3、函数里面镶嵌函数
def show_time(f):
start = time.time()
time.sleep(2)
f()
end = time.time()
print(‘spend %s‘%(end-start))
def foo():
print(‘foo....‘)
def soo():
print(‘soo....‘)
show_time(foo)
4、使foo()对应于show_time(),加上一个内嵌函数
# 4
def show_time(f):
def inner(): #为了使foo()运行对应 原来的show_time(f) 运行
start = time.time() #加上一个内嵌的函数
time.sleep(2)
f()
end = time.time()
print(‘spend %s‘%(end-start))
return inner #记得return
def foo():
print(‘foo....‘)
def soo():
print(‘soo....‘)
foo = show_time(foo)
foo()
5、装饰器的完成---加上@show_time()
#5
def show_time(f):
def inner(): #为了使foo()运行对应 原来的show_time(f) 运行
start = time.time() #加上一个内嵌的函数
time.sleep(2)
f()
end = time.time()
print(‘spend %s‘%(end-start))
return inner #记得return
@show_time
def foo():
print(‘foo....‘)
@show_time
def soo():
print(‘soo....‘)
foo()
soo()
6、完备装饰器
def show_time(f):
def inner(*x,**y): #加上星号是为了把foo(),add(x+y)不管多少个参数的都可以使用show_time的装饰器
start = time.time()
time.sleep(2)
f(*x,**y)
end = time.time()
print(‘spend %s‘%(end-start))
return inner
@show_time
def foo():
print(‘foo....‘)
@show_time
def soo():
print(‘soo....‘)
@show_time
def add(*a,**b):
sum = 0
for i in a:
sum+=i
print(sum)
time.sleep(1)
# add(1,2)
foo()
原文:https://www.cnblogs.com/hanjie955/p/12291842.html