案例:
import functools
import time
def log(kind):
def add_log(fun):
@functools.wraps(fun)
start_time=time.time()
res =fun(*args,**kwargs)
end_time =time.time()
return res
return add_log
@log('westos')
def add(x,y):
time.sleep(1)
return x+y
print add(1,2)
執行結果:
裝飾器就是為了補修改原來函式的**,以達到增加功能的作用,其實為了裝飾器更通用化;引數可以巢狀函式裡用來實現隱藏,並且實現全域性引數的功能,與函式一起繫結,結合這兩個知識點,就可以產生通用的帶有引數的裝飾器了。
案例:
import time
import functools
def title(kind):
def printstar(func):
@functools.wraps(func)
def f(*args,**kwargs):
res=func(*args,**kwargs)
print ',函式名:%s,執行返回值結果:%d'%(kind,title.__name__,res)
案例:
案例:在實際應用場景中,會採用多個裝飾器,先驗證是否登陸成功,再驗證許可權
import functools
import inspect
def is_root(fun):
@functools.wraps(fun)
inspect_res = inspect.getcallargs(fun,*args,**kwargs)
print 'inspect_res的返回值:%s'%inspect_res
if inspect_res.get('name')=='root':
res = fun(*args,**kwargs)
return res
else:
print 'error:no permisson add student'
login_session = ['root','admin','redhat']
def is_login(fun):
@functools.wraps(fun)
if args[0] in login_session:
res =fun(*args,**kwargs)
return res
else:
print 'error:%s未登陸!'%args[0]
@is_login
@is_root
def add_student(name):
print '新增學生資訊...'
Python學習之路 裝飾器(1)
裝飾器本身是利用閉包實現的,因此只有真正學會了閉包中的知識點才能完全理解裝飾器的語法。試想乙個問題 在乙個工程中有乙個函式func 現在有乙個需求是func 現在本身不能滿足的,因此需要重新實現func 的功能。這是正常的思路,也是可行的,但是卻違背了開發中的 開放 封閉 原則。封閉 函式本身的功能...
Python學習之路 裝飾器(2)
coding utf 8 def f1 func print in f1 def f1 inner print in f1 inner func return f1 inner def f2 func print in f2 def f2 inner print in f2 inner func r...
Python學習之路 裝飾器(3)
上兩篇提到的裝飾器的例子中,被修飾的函式沒有引數,那麼如果修飾帶引數的裝飾器又該如何書寫呢?coding utf 8 def f1 func print in f1 def f1 inner print in f1 inner func return f1 inner f1def f a,b pri...