python装饰器 不带参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import time def deco(func): def wrapper(): startTime=time.time() func() endTime=time.time() msecs=(endTime - startTime)*1000 print("time is %s" %msecs) return wrapper @deco def func(): print("hello") time.sleep(1) print("world") if __name__ == '__main__': f = func f()
这里的deco函数就是最原始的装饰器,它的参数是一个函数,然后返回值也是一个函数。其中作为参数的这个函数func()就在返回函数wrapper()的内部执行。然后在函数func()前面加上@deco,func()函数就相当于被注入了计时功能,现在只要调用func(),它就已经变身为“新的功能更多”的函数了。
带参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import time def deco(func): def wrapper(a,b): func(a,b) print("a*b=%d" %(a*b)) return wrapper @deco def func(a,b): print("hello h4ck") time.sleep(1) print("a+b=%d" %(a+b)) if __name__ == '__main__': f = func f(5,6)
参数不定 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import time def deco(func): def wrapper(*args,**kwargs): func(*args,**kwargs) print("haha yi gei wo li giaogiao!") return wrapper @deco def func(a,b): print("hello h4ck") time.sleep(1) print("a+b=%d" %(a+b)) @deco def func2(a,b,c,d): print("hello fun2") time.sleep(1) print("a+b+c+d=%d" %(a+b+c+d)) if __name__ == '__main__': func(5,6) func2(1,2,3,400)
多个装饰器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 import time def deco(func): print("a") def wrapper(*args,**kwargs): print("hello hu3sky") func(*args,**kwargs) return wrapper def deco2(func): print("b") def wrapper(*args,**kwargs): print("are you hu3sky2?") func(*args,**kwargs) return wrapper def deco3(func): print("c") def wrapper(*args,**kwargs): print("you are hu3sky3") func(*args,**kwargs) return wrapper @deco2 @deco3 @deco def func(a,b): print("hello h4ck") time.sleep(1) print("a+b=%d" %(a+b)) @deco2 @deco @deco3 def func2(a,b,c,d): print("hello fun2") time.sleep(1) print("a+b+c+d=%d" %(a+b+c+d)) if __name__ == '__main__': func(5,6) func2(1,2,3,400)
结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 C:\Users\asus\Desktop (master -> origin) λ test.py a c b c a b are you hu3sky2? you are hu3sky3 hello hu3sky hello h4ck a+b=11 are you hu3sky2? hello hu3sky you are hu3sky3 hello fun2 a+b+c+d=406
装饰器的执行顺序 总结一下就是,装饰顺序按靠近函数顺序执行,调用时由外而内,执行顺序和装饰顺序相反