上一篇文章:Python是動態語言:動態新增或刪除屬性、方法
下一篇文章:私有化規則與屬性Property
裝飾器功能:
- 引入日誌
- 函式執行時間統計
- 執行函式前預備處理
- 執行函式後清理功能
- 許可權校驗
- 快取
1、無引數函式的裝飾器
例項:
from time import ctime,sleep
def time_fun(func):
#內部包裹函式
def wrapped_fun():
#ctime():列印當前時間
print("%s 在 %s 時被呼叫"%(func.__name__,ctime()))
#執行函式執行
func()
#把內部巢狀函式作為物件返回
return wrapped_fun
@time_fun
def test():
print("test 執行了")
test()
#休眠3秒
sleep(3)
test()
結果:
test 在 Wed Aug 15 22:19:51 2018 時被呼叫
test 執行了
test 在 Wed Aug 15 22:19:53 2018 時被呼叫
test 執行了
2、有引數函式的裝飾器
例項:
from time import ctime,sleep
def time_fun(func):
#內部包裹函式
def wrapped_fun(a,b):
#ctime():列印當前時間
print("%s 在 %s 時被呼叫"%(func.__name__,ctime()))
#執行函式執行
func(a,b)
#把內部巢狀函式作為物件返回
return wrapped_fun
@time_fun
def test(a,b):
print(a+b)
test(1,2)
#休眠3秒
sleep(3)
test(3,4)
結果:
test 在 Wed Aug 15 22:23:07 2018 時被呼叫
3
test 在 Wed Aug 15 22:23:10 2018 時被呼叫
7
3、不定長函式的裝飾器
例項:
from time import ctime,sleep
def time_fun(func):
#內部包裹函式
def wrapped_fun(*args,**kwargs):
#ctime():列印當前時間
print("%s 在 %s 時被呼叫"%(func.__name__,ctime()))
#執行函式執行
func(*args,**kwargs)
#把內部巢狀函式作為物件返回
return wrapped_fun
@time_fun
def test(a,b,c):
print(a+b+c)
test(1,2,3)
#休眠3秒
sleep(3)
test(3,4,5)
結果:
test 在 Wed Aug 15 22:26:36 2018 時被呼叫
6
test 在 Wed Aug 15 22:26:39 2018 時被呼叫
12
4、帶返回值函式的裝飾器
例項:
from time import ctime,sleep
def time_fun(func):
#內部包裹函式
def wrapped_fun(*args,**kwargs):
#ctime():列印當前時間
print("%s 在 %s 時被呼叫"%(func.__name__,ctime()))
#執行函式執行
return func(*args,**kwargs)
#把內部巢狀函式作為物件返回
return wrapped_fun
@time_fun
def test(a,b,c):
print("test--",a+b+c)
@time_fun
def test2(a,b,c):
return a+b+c
test(1,2,3)
print(test2(1,2,3))
#休眠3秒
sleep(3)
test(1,2,3)
print(test2(3,4,5))
結果:
test 在 Wed Aug 15 22:31:14 2018 時被呼叫
test-- 6
test2 在 Wed Aug 15 22:31:14 2018 時被呼叫
6
test 在 Wed Aug 15 22:31:17 2018 時被呼叫
test-- 6
test2 在 Wed Aug 15 22:31:17 2018 時被呼叫
12
5、裝飾器帶有引數
例項:
from time import ctime,sleep
def time_fun_pre(pre="hello"):
def time_fun(func):
# 內部包裹函式
def wrapped_fun(*args, **kwargs):
# ctime():列印當前時間
print("%s 在 %s 時被呼叫,pre引數為:%s" % (func.__name__, ctime(),pre))
# 執行函式執行
return func(*args, **kwargs)
# 把內部巢狀函式作為物件返回
return wrapped_fun
return time_fun
@time_fun_pre("mark_test")
def test(a,b,c):
print("test--",a+b+c)
@time_fun_pre("mark_test2")
def test2(a,b,c):
return a+b+c
test(1,2,3)
print(test2(1,2,3))
#休眠3秒
sleep(3)
test(1,2,3)
print(test2(3,4,5))
結果:
test 在 Wed Aug 15 22:43:27 2018 時被呼叫,pre引數為:mark_test
test-- 6
test2 在 Wed Aug 15 22:43:27 2018 時被呼叫,pre引數為:mark_test2
6
test 在 Wed Aug 15 22:43:30 2018 時被呼叫,pre引數為:mark_test
test-- 6
test2 在 Wed Aug 15 22:43:30 2018 時被呼叫,pre引數為:mark_test2
12
6、類裝飾器
python類裝飾性必須要接受一個callable物件作為引數,然後返回一個callable物件,在python中,一般callable物件都是函式,
只要物件重寫了
__call__()方法,那麼這個物件就是callable物件。
例項:
class Test():
def __init__(self,func):
print("test初始化:",func.__name__)
self.func=func
def __call__(self, *args, **kwargs):
print("我呼叫了")
self.func
@Test
def test():
print("--test--")
test()
結果:
test初始化: test
我呼叫了