#装饰器:本质就是函数,功能是为其他函数添加附件功能,就是让函数执行前做什么,函数执行后做什么
#原则:
#1 不修改被修饰函数的源代码
#2 不修改被修函数的的调用方式

#装饰器知识储备:
#装饰器=高阶函数+函数嵌套+闭包
# 高阶函数满足下面条件之一就是高阶函数
# 1 把函数当作参数传递给另外一个函数
# 2 返回值值包含函数
#装饰器搞起
import time

def wap(func):    #2 func是test函数的内存地址
    print(func)
    def inter():
        start = time.time()
        func()     #5 func是test函数的内存地址就是执行test函数
        end = time.time() - start
        print('test运行执行时间为',end)
    return inter #3 返回一个函数inter内存地址

@wap
def test():
    time.sleep(1)
    print('test执行完成')

# res = wap(test)   #1 执行wap(test) 把test函数的内存地址传递给 func
# res()             #4 rest 是wap 函数返回过来的inter内存地址加上括号就是执行inter函数
#以上是修改了函数的的调用方式

#不修改函数的的调用方式,但是在之前需要做一个赋值操作
# test = wap(test)
# test()

#使用另外一个方式:
#@wap 就相当于执行了test = wap(test)
test()

 

#加一个返回值的
import time
def wap(func):
    print(func)
    def inter():
        start = time.time()
        ret = func()  #运行的是test
        end = time.time() - start
        print('test运行执行时间为',end)
        return ret    #把运行test的返回值返回
    return inter

@wap        #test = wap(test)
def test():
    time.sleep(1)
    print('test执行完成')
    return 'test 返回值'

res = test()  #运行的是inter
print(res)    #结果是test 返回值;  1: 因为test()就是运行inter()函数;inter()函数会运行ret = func() ;也就是运行test()函数,这时候test函数有一个返回值返回给了ret ,2: inter函数运行到最后,也会返回ret给res

 

 
import time

def wap(func):
print('wap',func) #func = <function sum at 0x031F3858>
def inner():
start = time.time()
func()
end = time.time() - start
print(end)
return inner #返回给sum

@wap #sum = wap(sum)
def sum():
time.sleep(2)
print('我执行了')
print(sum) #接收 inner内存地址 <function wap.<locals>.inner at 0x012D3780>
sum() #执行inner()

 执行结果:

  wap <function sum at 0x02B53858>

       <function wap.<locals>.inner at 0x02B53780>

  我执行了

       2.0003716945648193

 

装饰器传参:

def wap(func):
def inner(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print(args)
end = time.time() - start
print(end)
return inner

@wap
def sum(name,age):
time.sleep(2)
print('我执行了')
sum('tom',12)

执行结果:

  我执行了
  ('tom', 12)
  2.0003695487976074

 

装饰器上面传参数:

import time
def wanrun(leo='http'):
def wap(func):
def inner(*args,**kwargs):
print(leo)
start = time.time()
func(*args,**kwargs)
print(args)
end = time.time() - start
print(end)
return inner
return wap

@wanrun('测试') #wanrun('测试')等于执行wanrun('测试')这个函数,开始触发函数wanrun执行 ---> wanrun执行就会返回wap函数;所有这个地方最终还是显示@wap ; sum = wap(wanrun)
def sum(name,age):
time.sleep(2)
print('我执行了')
#sum = wap(wanrun) #@wanrun 等于 sum = wap(wanrun) 返回inner
sum('tom',12) ##运行的是inter

 

posted on 2018-05-08 09:53  Python哥  阅读(193)  评论(0编辑  收藏  举报