装饰器的执行时从上往下的顺序执行,结构性从下往上
装饰器之前首先要讲述一下闭包,闭包之前谈一下函数式编程:把函数作为函数的参数以及返回值的编程方式
#多个装饰器
import time
def deco01(func):
def wrapper(*args, **kwargs):
print("this is deco01")
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
print("deco01 end here")
return wrapper
def deco02(func):
def wrapper(*args, **kwargs):
print("this is deco02")
func(*args, **kwargs)
print("deco02 end here")
return wrapper
@deco01
@deco02
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b))
if __name__ == '__main__':
f = func
f(3,4)
#func()
'''
this is deco01
this is deco02
hello,here is a func for add :
result is 7
deco02 end here
time is 1003 ms
deco01 end here
'''
多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身。
def work1():
print('这是被引用的函数')
# 调用函数
work1()
# 引用函数
w = work1
def wrapper():
print('start')
def inner():
print('inner')
print('end')
return inner
# inner=wrapper()
#输出结果为 start end 只用了第一层函数
# inner()
#输出结果为:inner 只用了第二层函数
inner()相当于wrapper()() 但是wrapper()()这样写并不规范
在类方法和静态方法中讲到了下面两个命令,其实就是装饰器,在原有的程序上增加新的功能(方法)
# @staticmethod
# @classmethod
def w1(func):
def inner():
print('w1 inner')
func()
return inner
def w2(func):
def inner():
print('w2 inner')
func()
return inner
@w2
@w1
def f1():
print('f1')
f1() 输出结果:
w2 inner
w1 inner
f1
多层装饰器:
def inner():
return '<b>'+func()+'</b>'
return inner
def makeIta(func):
def inner():
return '<i>' +func()+'</i>'
return inner
@makeIta
@makeBold
def f():
return '二期最强,月薪2k!'
print(f())
f1() 输出结果为:
<i><b>二期最强,月薪2k!</b></i>
装饰器工厂
def factory(arg=None):
def timefun(func):
def inner():
if arg:
print('you')
else:
print('wu')
return func()
return inner
return timefun
@factory(1)
def f():
print('f')
简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。