python 装饰器
装饰器:
本质是函数,装饰其他函数,就是为其他函数添加附加功能
函数即“变量”
要求:
1 不能修改被装饰的函数的源代码
2 不能修改悲壮是的函数的调用方式
高阶函数
a 把一个函数名当做实参传给另个一函数(可以做到在不修改源代码的情况下给函数添加附加功能)
def bar(): print('in the bar ') def test1(fun): print(fun) fun() # 实际上就是执行bar函数 test1(bar) 把一个函数的名当做实参传给另个一个函数
首先定义了bar()函数,定义了一个形参为fun的函数test1,然后在执行test1的时候,实参为bar,在test1函数中,bar赋值给了fun,fun如果不加括号,fun就表示的是bar的函数所在的内存地址,如果加上括号fun(),则表示调用函数bar()
b 返回值中包含函数名(比修改函数的调用方式)
def bar(): print(" in the bar") def test1(): print(fun)
fun() return fun # 返回值中包含函数名 bar = test1(bar) # 将函数test1返回值用变量bar接收 bar()
在这段代码中,先定义bar函数,然后再调用test函数时,将bar函数的内存地址当做实参传给fun,在fun中就实现了bar的功能,并返回bar的内存地址,也就是fun的内存地址,然后将这个内存地址再赋值给变量bar,最后在使用bar(),这样达到了偷天换日的目的。
嵌套函数
函数嵌套 在函数func内
def func():
print(3)
def f():
print(1)
print(2)
f()
func()
函数嵌套就是在函数中,再定义一个函数
高阶函数+嵌套函数 ==》装饰器
import time def auth(auth_type): #用来接收@装饰器,传送过来的参数 def wapper(fun): def timmer(*args,**kwargs): #使用这种参数表示接受所有参数 if auth_type == 'local': start_time = time.time() fun(*args,**kwargs) #使用这种参数表示接受所有参数 end_time = time.time() print("in the fun time :%s" %(end_time -start_time)) return timmer # 传回返回值 return wapper @auth(auth_type='local') #test1 = timmer(),将参数转给auth装饰器 def test1(): time.sleep(3) # 等待三秒,再执行 print("in the test1") test1() #将参数传给timmer装饰器 auth定义一个大范围,这里的参数局决定函数执行结果