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定义一个大范围,这里的参数局决定函数执行结果
View Code

 

posted @ 2019-03-19 16:27  msKk1  Views(95)  Comments(0Edit  收藏  举报