标签:python rgs 示例 执行 不能 top 角度 rap 理解
本质上,装饰器就是返回一个函数的高阶函数。装饰器就是一个函数
装饰器的原则:
函数即变量:
在python中,一个变量首先被定义,分配内存空间,然后再使用。
以x=1,这个简单的赋值语句为例子。首先在内存中分配一个空间,x指向该内存空间,该内存空间内存入“1”
函数名本质也是一个变量,所以def test()这个语句执行后,就是在内存中分配一个空间,test指向该内存,该内存中存入函数体

代码示例:
#Author:Yueru Sun
#函数即变量
#示范一:
def foo():
print(‘in the foo‘)
foo()
#示范二:
def bar():
print(‘in the bar‘)
def foo():
print(‘in the foo‘)
bar()
foo()
#示范三:
#变量在使用的时候是先定义再使用
def foo():
print(‘in the foo‘)
bar()
def bar():
print(‘in the bar‘)
foo()
#示范四:
# def foo():
# print(‘in the foo‘)
# bar()
#foo()#报错,因为此时bar还没有定义
# def bar():
# print(‘in the bar‘)
特别需要注意示例三是可以执行成功的,”示例三“=”示例二“
因为在foo()执行,首先是def 了foo()和bar(),所以当执行到foo()的时候可以找到foo()和bar()
示例四是不可以执行的。因为在foo()执行之前,bar还没有在内存中定义,找不到
高阶函数:
高阶函数就是满足函数当作参数被传递或者函数的返回值是函数
嵌套函数:
def f1():
def f2():
def f3():
print(‘from f3‘)
f3()
f2()
f1()
f3() #报错,为何?请看下一小节
还是从函数就是一个变量这个角度解释,因为f3()是在f1()内部定义的,相当于是”局部变量“,所以不能在函数外部访问到f3()
import time
def timer(func): #timer(test1) func=test1
def deco(*args,**kwargs):
start_time=time.time()
func(*args,**kwargs) #run test1()
stop_time = time.time()
print("the func run time is %s" %(stop_time-start_time))
return deco
@timer #test1=timer(test1)
def test1():
time.sleep(1)
print(‘in the test1‘)
test1()
#执行结果:
#in the test1
#the func run time is 1.0033304691314697
上面的代码解释:
函数timer最本质的作用就是返回一个deco,deco是一个函数的地址空间
接下来需要理解的是@timer等价于:test1=timer(test1),timer(test1)执行之后就会返回deco,那执行test1就相当于执行了deco,即test1()=deco()
所以test1()的结果是:
in the test1
the func run time is 1.0033304691314697
再来一个例子:
Author:Yueru Sun
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
func(*args,**kwargs)
end_time=time.time()
print(‘func 的 运行时间是:%s‘%(end_time-start_time))
return wrapper
@timmer
def test():
time.sleep(2)
print(‘test‘)
test()
@timmer
def test1(number):
time.sleep(1)
print(‘func的第%s执行‘%(number))
test1(1)
还是上面的理解过程,梳理一下执行过程:
首先是定义了timer函数,接下来执行@timer就等价于执行test1=timer(test1),执行完返回了deco,那么test1(number)=deco(number)
如果装饰器需要传入参数,那么就在上面的基础上再嵌套一次函数
def timmer1(text):
def out_wrapper(func):
def wrapper(*args,**kwargs):
start_time=time.time()
func(*args,**kwargs)
end_time=time.time()
print(‘%s func 的运行时间是%s‘%(text,end_time-start_time))
return wrapper
return out_wrapper
@timmer1(‘sun‘)
def test2():
print(‘test2‘)
test2()
具体的理解不赘述了,可以复习一下这个文章:
http://www.cnblogs.com/alex3714/articles/5765046.html
编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
标签:python rgs 示例 执行 不能 top 角度 rap 理解
原文地址:https://www.cnblogs.com/mesunyueru/p/8969897.html