裝飾器與多層裝飾器
阿新 • • 發佈:2019-02-06
裝飾器的執行時從上往下的順序執行,結構性從下往上
裝飾器之前首先要講述一下閉包,閉包之前談一下函數語言程式設計:把函式作為函式的引數以及返回值的程式設計方式
#多個裝飾器
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裝飾器的好處就是在不用更改原函式的程式碼前提下給函式增加新的功能。